使用awk读取文件并搜索其他文件

时间:2016-10-23 18:12:10

标签: shell file awk

我正在读取每行都有数字的文件。 我需要搜索符合这些数字和其他条件的另一个文件。我试图用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

什么都不返回。

2 个答案:

答案 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