我使用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
答案 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
和任何其他更改(例如,跳过第一行,跳过最后一行等)同样微不足道。