我正在读取每行都有数字的文件。 我需要搜索符合这些数字和其他条件的另一个文件。我试图用awk做这个,但面临一个问题。
档案a.txt
:
1476
1477
1497
现在我需要在第12列打印具有这些数字的行,并在第3列打印0。
档案b.txt
:
r 1.040496 2 1 ack 40 ------- 1 3.0 0.0 0 1165
r 1.040496 2 1 ack 40 ------- 1 3.0 0.0 0 1165
r 1.050528 2 1 ack 40 ------- 1 3.0 0.0 0 1165
r 1.050528 1 0 ack 40 ------- 1 3.0 0.0 0 1165
r 1.050528 1 0 ack 40 ------- 1 3.0 0.0 0 1476
r 1.06056 1 0 ack 40 ------- 1 3.0 0.0 0 1165
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 1 1203
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 1 1203
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 2 1477
r 1.061392 0 1 tcp 1040 ------- 1 0.0 3.0 2 1204
r 1.071392 0 1 tcp 1040 ------- 1 0.0 3.0 1 1497
r 1.071392 1 2 tcp 1040 ------- 1 0.0 3.0 1 1203
我的剧本:
while read LINE
do
awk -F ' ' '($3 == 0) && ($12 == $LINE)' b.txt
done < a.txt
什么都不返回。
答案 0 :(得分:2)
尝试:
$ while read line; do awk -v x="$line" '($3 == 0) && ($12 == x)' b.txt; done < a.txt
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 2 1477
r 1.071392 0 1 tcp 1040 ------- 1 0.0 3.0 1 1497
在这里,我们使用-v
选项指定awk变量x
以获得shell变量$line
的值。
我们不需要shell循环:
$ awk 'FNR==NR{a[$1]; next} $3==0 && $12 in a' a.txt b.txt
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 2 1477
r 1.071392 0 1 tcp 1040 ------- 1 0.0 3.0 1 1497
在读取第一个文件a.txt时,我们为每行的值创建一个关键数组a
。
在阅读第二个文件b.txt时,如果$3==0
和第12个字段$12
是关联数组a
中的键,则打印该行。
“如果我需要添加结果的第二列怎么办?”
$ awk 'FNR==NR{a[$1]; next} $3==0 && $12 in a {s+=$2; print} END{print "Sum=",s+0}' a.txt b.txt
r 1.06056 0 1 tcp 1040 ------- 1 0.0 3.0 2 1477
r 1.071392 0 1 tcp 1040 ------- 1 0.0 3.0 1 1497
Sum= 2.13195
答案 1 :(得分:1)
尝试以下代码 -
awk 'FNR==NR{a[$1]=$1;next;} $3==0 && $NF in a {print $0}' a.txt b.txt