所以,我已经了解了着名的" c&&! - c" ..虽然可能没有。
当使用Awk在匹配的行之后打印第N行时,我想在同一输出行上打印第N行,一个空格,然后是匹配的行。
例如,给定文件tmpfile.txt;
blar
Matchme
blar
XXXX
blar
我想获得以下内容
XXXX Matchme
但是..使用
awk 'c&&!--c ; /Matchme/ {c=2} ; /Matchme/' tmpfile.txt
给出
Matchme
XXXX
添加printf没有帮助..
awk 'c&&!--c ; /Matchme/ {c=2} ; /Matchme/ {printf $0}' tmpfile.txt
给出
MatchmeXXXX
有人可以解释为什么第一个模式/动作最后被打印出来吗?
由于
gary_s
答案 0 :(得分:2)
这应该做:
awk 'c&&!--c {print $0,f} /Matchme/ {c=2;f=$0}' file
XXXX Matchme
将pattern
行保存到变量f
,然后在2
行后打印当前行和f
awk 'c&&!--c ; /Matchme/ {c=2} ; /Matchme/ {printf $0}'
此部分/Matchme/ {printf $0}
在找到模式时是正确的,因此会打印出来
然后在两行之后它将打印XXXX
答案 1 :(得分:1)
这会产生您想要的输出:
$ awk 'c && !--c {print $0, s} /Matchme/ {s=$1; c=2}' file
XXXX Matchme
开始时的c
检查会阻止第一行打印(因为在程序开始时c
将评估为0)。正如in the comments所指出的那样(感谢Ed),这也意味着只有在&&
为正时才会评估c
的右侧。当/ Matchme /匹配时,将存储第一列的值,并从2开始倒计时。 !--c
仅在c
为0时才为真,因此print
在匹配后会发生两行。