行が異なる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
リストを生成します。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