他のファイルの値に基づいたファイルのフィルタリング

他のファイルの値に基づいたファイルのフィルタリング

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

おすすめ記事