如果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
但我无法提出更大/更小的条件。 我该如何添加它?
答案 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"