查找列是否在范围内

时间:2018-06-18 10:19:11

标签: linux awk range

如果file1的列在列范围内,我想要找到两个文件。

file1.txt
1 19
1 21
1 24
2 22
4 45

file2.txt
1 19 23 A
1 20 28 A
4 42 45 A

我正在尝试查看1st column的{​​{1}}与file1.txt的{​​{1}}是否相同,1st column file2.txt是否second column位于file1.txt 2nd and 3rd columns之间,如果它在范围内,则追加。

所以输出应该是:

file2.txt

我想要的是找出第一列是否相同:

output.txt

1 19 23 A 1 19
1 19 23 A 1 21
1 20 28 A 1 24
4 42 45 A 4 45

但我无法提出更大/更小的条件。 我该如何添加它?

3 个答案:

答案 0 :(得分:1)

使用awk

$ awk 'NR==FNR{a[$1]=a[$1]" "$2;next} {split(a[$1],b);for(i in b) if(b[i]>=$2 && b[i]<=$3) print $0,$1,b[i]}' file1 file2
1 19 23 A 1 19
1 19 23 A 1 21
1 20 28 A 1 21
1 20 28 A 1 24
4 42 45 A 4 45

第一个block语句将file1的元素存储到数组a中。数组索引是文件的第一列,数组元素是第一列中所有数字的串联,第一列中的数字相同。

第二个块语句循环遍历数组a元素,其索引与第一列相同,并检查数组中的数字是否在范围之间。

另一种方法是使用join

$ join -o 1.1 1.2 1.3 1.4 1.1 2.2 file2 file1 | awk '$6 >= $2 && $6 <= $3'
1 19 23 A 1 19
1 19 23 A 1 21
1 20 28 A 1 21
1 20 28 A 1 24
4 42 45 A 4 45

join -o生成了预期的输出格式。 awk语句正在过滤 范围内的行。

答案 1 :(得分:1)

使用join + awk:

join file2.txt file1.txt | awk '{if ($2 <= $5 && $5 <= $3) { print $1,$2,$3,$4,$1,$5 } }'

在第一列上连接前两个文件,然后比较列并打印输出(第一列打印两次,连接隐藏它)。

答案 2 :(得分:1)

以下也可以帮到你。

while read first second
do
  awk -v fir="$first" -v sec="$second" '$1==fir && ($2<=sec && $3>=sec){print $0,fir,sec}' file2
done < "file1"