比较具有不同行的 2 个文件(如果它落在数字范围内)

比较具有不同行的 2 个文件(如果它落在数字范围内)

我有两个具有不同行的文件。文件 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生成一个按数字和顺序排列catsort组合列表chrpos

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您击中一行并仅根据您的条件测试这些行时hicmNF==4NF==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

相关内容