数値範囲に属する場合は、異なる行を持つ2つのファイルを比較します。

数値範囲に属する場合は、異なる行を持つ2つのファイルを比較します。

行が異なる2つのファイルがあります。ファイル1には860行、ファイル2には650,000行があります。

ファイル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

ファイル1の列2と列3の間にある場合は、ファイル2の各項目を比較したい(列1も確認する必要があります(両方のファイルの文字))。一致する場合は、それに応じて列1と列2を印刷する必要があります。ファイル2とファイル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}'

数値で順次配列された組み合わせのcatリストを生成します。sortchrpos

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

おすすめ記事