![使用正则表达式和第二个文件过滤 .txt 文件](https://linux22.com/image/157094/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%92%8C%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E8%BF%87%E6%BB%A4%20.txt%20%E6%96%87%E4%BB%B6.png)
我有一个 file.txt (每行的列数不同):
例如
1 21:10 21:23
2 1:94 1:100 1:123
3 14:1 14:60 14:23
我有另一个文件 (file2.txt),其中包含 4 列(用“”分隔)
a 21 20 60
b 2 80 90
c 14 50 100
d 2 10 20
e 14 1 12
我想检查第一个文件每行的初始部分(21;1;14,每行都相等)并选择第二个文件中的值之间“:”之后的部分的元素(第3个e第 4 列)当且仅当第 2 列等于“:”之前的部分
例如计算:
> file.txt: 1th row: 21:10 21:23 --> 21 is in a in file2.txt so 20<10<60 NO
> but 20<23<60 is true so I take it.. and so on, I see for each row in file2.txt
另一个例子:
file.txt: 3th row: 14:1 14:60 14:23 --> 14 is in c and e in file2.txt so
50<1<100 NO (for c)
50<60<100 YES (for c)
50<23<100 NO (for c)
1<1<12 YES (for e)
1<60<12 NO (for e)
1<23<12 NO(for e)
如果一个元素介于 2 个值之间(仅适用于 file2.txt 的一行),我接受它。
前任。结果:
1 21:23
2 14:1 14:60
(第 2 行被删除,因为 1 不包含在 file2.txt 第 2 列的任何单元格中)
答案1
假设你的意思是<=
而不是<
因为1<1<12
是不是 YES
:
$ cat tst.awk
NR==FNR {
cnt[$2]++
beg[$2,cnt[$2]] = $3
end[$2,cnt[$2]] = $4
next
}
{
out = ""
for (i=2; i<=NF; i++) {
split($i,parts,/:/)
key = parts[1]
for (j=1; j<=cnt[key]; j++) {
if ( (beg[key,j] <= parts[2]) && (parts[2] <= end[key,j]) ) {
out = out OFS $i
break
}
}
}
if ( out != "" ) {
print ++outNr out
}
}
$ awk -f tst.awk file2 file1
1 21:23
2 14:1 14:60
以上内容已使用您提供的 2 个输入文件进行了测试:
$ tail file1 file2
==> file1 <==
1 21:10 21:23
2 1:94 1:100 1:123
3 14:1 14:60 14:23
==> file2 <==
a 21 20 60
b 2 80 90
c 14 50 100
d 2 10 20
e 14 1 12
以及您提供的预期输出。