具有匹配字段的Bash I / O打印记录

时间:2014-03-12 16:26:38

标签: bash awk io

我一直在搞乱awk并试图让bash更加舒服。我的问题是如何处理文本文件,如:

5555
5554 No-match
5555 Match1
2421 No-match
5552 No-match
5555 Match2
5555 Match3

扫描第一个记录中的第一个字段($ 1)(在本例中为5555),然后搜索每个剩余记录并打印第二个字段($ 2),如果$ 1匹配。这是我写的:

awk '{(NR==1)(id=$1) (NR>1)(if(id==$1))printf("%s\n",$2)}'

我无法找到在第一个记录之后测试所有记录的方法。我想:

(NR>1)(if(condition))(action) 

会导致它执行我想要的记录> 1然而事实并非如此。任何帮助都会很棒!

3 个答案:

答案 0 :(得分:2)

你非常接近。尝试:

awk 'NR==1{id=$1}NR>1&&id==$1{printf("%s\n",$2)}' file

答案 1 :(得分:1)

试试这个:

awk 'NR==1 {id=$1} NR>1 {if (id==$1) printf("%s\n",$2)}'

Awk语句包含模式,然后是动作。行动应该在括号中。所以这里我们有两个陈述。首先,如果我们在第一行,请捕获第一个字段:

NR==1 {id=$1}

然后,在除第一行之外的每一行上,将第一个字段与捕获的值进行比较,如果匹配则打印第二个字段:

NR>1 {if (id==$1) printf("%s\n",$2)}

答案 2 :(得分:0)

awk 'NR==1{id=$1}; NR>1{ if ($1==id) {print $2 }}' TestFile
Match1
Match2
Match3