Awk - 匹配范围模式开始的商店线

时间:2018-01-12 09:36:42

标签: awk

我使用awk来操作一个范围内的行,但是我需要在我的操作中使用匹配范围模式的行。

现在我这样做:

awk '/BANANA/,/END/ {if ($0 ~ /BANANA/) line=$0; print line, $2}' infile.txt

有更优雅的方式吗?这种方式不需要我在范围的开头存储$ 0? awk是否将此行保留在某处?

谢谢和最好的问候

编辑(添加样本):

infile.txt

few
r t y u i
few
BANANA
    a b c d
    a b c d
    a b c d
    a b c d
    a b c d
    a b c d
    a b c d
END
r t y u i
ewqf
few
r t y u i
few
r t y u i
f

预期产出

BANANA 
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA

2 个答案:

答案 0 :(得分:0)

唯一的"技巧"在你的情况下,我可以建议"条件":

awk '/BANANA/ && (r=$0),/END/{ print r, $2 }' infile.txt
  • (r=$0) - 仅将当前记录值(即BANANA)分配给变量r ,从而避免对每条记录进行条件检查if ($0 ~ /BANANA/)在一个范围内

输出:

BANANA 
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA b
BANANA 

答案 1 :(得分:0)

永远不要使用范围表达式,因为它们使得琐碎的任务变得非常简单,但是当你需要做一些有趣的事情时需要完全重写。始终使用标志。而不是:

awk '/BANANA/,/END/ { do something }' infile.txt

你应该写:

awk '/BANANA/{f=1} f{ do something } /END/{f=0} ' infile.txt

然后加强那就做你想要的只是:

awk '/BANANA/{f=1; line=$0} f{ print line, $2 } /END/{f=0} ' infile.txt

和任何其他更改(例如,跳过第一行,跳过最后一行等)同样微不足道。