根据另一个文件中的值过滤文件

根据另一个文件中的值过滤文件

我有两个文件

文件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 中获取行,其中第三列的值在 file2 中相应行的 ±1 范围内(其中第四列的值相同)。

期望输出:

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

仅使用无需 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

相关内容