ファイルが2つあります。
ファイル1:
U 20 100 1_A 1_A
U 14 200 1_B 1_B
U 14 300 1_C 1_C
ファイル2:
D 12 90 1_A 1_A
D 15 97 1_A 1_A
D 16 99.5 1_A 1_A
D 9 111 1_A 1_A
D 71 200 1_B 1_B
D 88 198 1_B 1_B
D 12 210 1_B 1_B
D 11 211 1_B 1_B
D 9 266 1_C 1_C
D 18 278 1_C 1_C
D 20 300.5 1_C 1_C
D 17 300 1_C 1_C
4列には2つのファイルの同じ値が含まれていますが(5列も4列と同じです)、file1では各値が1回だけ表示され、file2では各値が複数回表示されますが、2列は3列とは異なります。 。
3番目の列の値がfile2の対応する行(4番目の列の値が同じ)の±1以内にあるfile2から行を取得したいと思います。
予想出力:
D 16 99.5 1_A
D 71 200 1_B
D 20 300.5 1_C
D 17 300 1_C
これを試してください:
while read c1 c2 c3 c4
do
awk '{if ( a = $4 && b < $3+1 && b > $3-1 ) print $1 " " $2 " " $3 " " $5 }' a="$c4" b="$c3" file2.txt > output.txt
done < file1.tx
私は次のような結果を得ました。
D 20 300.5 1_C
D 17 300 1_C
したがって、最後の行のb値のみを使用します。
答え1
のみ使用アッシェルループは必要ありません。
awk 'NR==FNR{ col4[$4]=$3; next }
(-1< col4[$4]-$3 && col4[$4]-$3 <1) { print $1, $2, $3, $5 }' file1 file2
3番目の列の値に±1を加えてそれらのペアと比較する代わりに、2つの数字を引いた結果が正確に(-1,1)の範囲内にあることを確認する必要があります。
差を [-1,1] の範囲にするには、次のようにします。
awk 'NR==FNR{ col4[$4]=$3; next }
(-1<= col4[$4]-$3 && col4[$4]-$3 <=1) { print $1, $2, $3, $5 }' file1 file2