我有两个具有不同行的文件。文件 1 有 860 行,文件 2 有 650000 行。
文件1
chr start End CM
1 0 2000 p3.5
1 2400 8000 p5.3
2 9500 20000 q2.4
3 0 3000 p7.6
4 60800 89000 p77.1
8 12000 36000 q4.5
8 55000 78000 p22.4
文件2
chr pos
1 1500
2 10500
4 70000
8 13000
我想比较文件 2 中的每个条目,如果它位于文件 1 的第 2 列和第 3 列之间(还应检查第 1 列(两个文件中的 chr)),如果匹配,则应打印相应的第 1 列和第 2 列文件 2 的第 4 列和文件 1 的第 4 列。
期望的输出:
chr pos CM
1 1500 p3.5
2 10500 q2.4
4 70000 p77.1
8 13000 q4.5
感谢您的帮助
答案1
最简单的方法似乎是对它们进行排序,然后解析排序后的列表
cat file1 file2 |
sort -k1,1n -k2,2n |
awk 'NF==4{c=$1; lo=$2; hi=$3; cm=$4}
NF==2 && c==$1 && lo<=$2 && hi>=$3{printf "%s\t%s\t%s\n", $1, $2, cm}'
and生成一个按数字和顺序排列cat
的sort
组合列表chr
pos
chr pos
chr start End CM
1 0 2000 p3.5
1 1500
1 2400 8000 p5.3
2 9500 20000 q2.4
2 10500
3 0 3000 p7.6
4 60800 89000 p77.1
4 70000
8 12000 36000 q4.5
8 13000
8 55000 78000 p22.4
并且只要awk
通过文件一次选取 、 、 的新值,并且chr
每当lo
您击中一行并仅根据您的条件测试这些行时hi
cm
NF==4
NF==2
1 1500 p3.5
2 10500 q2.4
4 70000 p77.1
8 13000 q4.5
以及 650,000 行测试文件
real 0m1.511s
user 0m1.249s
sys 0m0.477s