我有两个文件
文件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
仅使用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