Text-Processing

根據來自另一個文件的值過濾文件

  • March 1, 2022

我有兩個文件

文件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 列在兩個文件中包含相同的值(第 5 列也與第 4 列相同),但在 file1 中,每個值只出現一次,而在 file2 中,每個值出現多次,但在第 2 列和第 3 列中存在差異。

我想從 file2 中獲取第 3 列的值在 file2 中相應行的 ±1 範圍內的行(其中第 4 列的值相同)。

期望輸出:

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 值。

只使用awk而不需要 shell 循環:

awk 'NR==FNR{ col4[$4]=$3; next }
 (-1< col4[$4]-$3 && col4[$4]-$3 <1) { print $1, $2, $3, $5 }' file1 file2

您應該檢查兩個數字的減法結果是否完全在 (-1,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

引用自:https://unix.stackexchange.com/questions/692421