只匹配一次单词 - AWK

时间:2014-09-10 04:17:43

标签: regex awk

我正在阅读GNU awk手册,但我没有找到一个正则表达式,我只能匹配一次字符串。 例如,从文件aha_1.txt,aha_2.txt,aha_3.txt,....我想从第一次ana出现在文件中打印第二列$ 2(aha_1.txt,aha_2.txt,aha_3。文本, ....)。另外,当pedro出现时同样的事情。

aha_1.txt

luis 321 487

ana 454 345

pedro 341 435

ana 941 345

aha_2.txt

pedro 201 723

gusi 837 134

ana 319 518

cindy 738 278

ana 984 265

与此同时,我这样做了,但它不仅仅是第一次计算所有情况

/ ^ ana / {print $ 2} / ^ pedro / {print $ 2}

感谢您的帮助: - )

2 个答案:

答案 0 :(得分:2)

在打印第一个值(以字符串ana 开头的行中的第二列)后,只需调用exit命令。

$ awk '$1~/^ana$/{print $2; exit}' file
454

答案 1 :(得分:1)

原始问题

仅处理一个文件。

awk '/ana/ { if (ana++ == 0) print $2 }' aha.txt

awk '/ana/ && ana++ == 0 { print $2 }' aha.txt

或者,如果您不需要执行任何其他操作,则可以按照Avinash Raj answer中{{3}}的建议,在打印后退出。

修订问题

  

我有很多文件(aha.txtaha_1.txtaha_2.txt,...)每个文件里面都有ana,我只需要暂时ana {{ 1}}出现在每个文件中,输出必须是一个文件。

作为一个问题,这有点不同。如果你有GNU grep,你可以使用(或多或少):

grep -m1 -e ana aha*.txt

这将列出整行,而不仅仅是第2列,并列出文件名,因此它不是一个完美的匹配。

使用awk,您需要多做一点工作:

awk 'FILENAME != old_file { ana = 0; old_file = FILENAME }
     /ana/ { if (ana++ == 0) print $2 }' aha*.txt