Dja*_*sef 1 awk text-processing
我有一个看起来像这样的文件
ABC
2 3 4
7 9 4
1 2 5
ABC
13 11 17
2 1 1
ABC
7 9 14
5 8 2
9 9 9
7 1 2
Run Code Online (Sandbox Code Playgroud)
我想在每个“ABC”值的末尾打印“END”这个词,这样文件就会像这样
ABC
2 3 4
7 9 4
END 1 2 5
ABC
13 11 17
END 2 1 1
ABC
7 9 14
5 8 2
9 9 9
END 7 1 2
Run Code Online (Sandbox Code Playgroud)
我尝试了很多但我没有解决它,所以任何人都可以在这里提供帮助。
awk '/^ABC/ && pre { print dpre ORS $0; pre=""; next }
{ if(pre) print pre; pre=dpre=$0; sub(/ {0,4}/, "END ", dpre) }
END{ if(pre) print dpre }' infile
Run Code Online (Sandbox Code Playgroud)
只有当一行以ABC
字符串开头并且pre
还设置了临时变量时,才会执行第一个块,否则将执行下一个块。
该END{...}
块将只执行一次,并在所有结束后执行。
对于第一行当然还pre
没有设置变量,所以将执行第二个块并执行以下操作:
如果里面有东西pre
先打印if(pre) print pre
(这样我们会延迟打印上一行以检查下一行是否以 开头ABC
,因为我们需要END
在该行前面添加)
然后我们将该行复制到两个单独的变量中,pre
并且dpre
(一个将保持不变(稍后我们需要原封不动地打印它),而对于另一个,sub(/ {0,3}/,"END ", dpre)
我们将END
字符串添加到dpre
.
请注意,使用 {0,4}
(零个或最多 4 个空格;4 是从 的长度中获得END<SPC>
)我们确保END
字符串将始终在前面,并防止在根本没有空格的情况下截断原始行值。
您可以在下面跟踪命令的每次迭代以供您自己理解:
ABC
( /^ABC/
)开头?
pre
设置?
dpre
变量的内容,然后是单个换行符ORS
,然后是当前行本身pre=""
并跳转到REPEAT因为next
语句告诉了这一点。pre
设置?
pre
它设置在“ if(pre) print pre
”中;pre=dpre=$0
;END
为dpre
.加上字符串。pre=dpre=$0
;END
为dpre
.加上字符串。dpre
如果已设置,则打印变量的最后状态,否则跳转到REPEAT。