![在模式后使用 awk 附加输入文件(循环?)](https://linux22.com/image/61822/%E5%9C%A8%E6%A8%A1%E5%BC%8F%E5%90%8E%E4%BD%BF%E7%94%A8%20awk%20%E9%99%84%E5%8A%A0%E8%BE%93%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%88%E5%BE%AA%E7%8E%AF%EF%BC%9F%EF%BC%89.png)
我正在尝试获取一个名为“输入”的文本文件,其形式为
line1
line2
line3
PATTERN
x y z
x y z
lineN
并使用 awk 在每个“xy z”行后放置一个数字 (1)。我需要输出中 PATTERN 之前和“xy z”行 (lineN) 之后的行。我需要的输出如下所示:
line1
line2
line3
PATTERN
x y z 1
x y z 1
lineN
到目前为止我所拥有的是:
awk '/PATTERN/ {getline; print $0 " 1" }' < input > output
这给出:
x y z 1
是否可以设置一个循环来让 awk 附加任意数量的“xy z”行或在“xy z”类型行完成后停止?
答案1
循环可以帮助:
awk '/PATTERN/{print;getline;while(!/lineN/){$(NF+1)=" 1";print;getline}}1'
或者延长@贾尼斯的想法:
awk '/lineN/{f=0}f{$(NF+1)=" 1"}/PATTERN/{f=1}1'
答案2
您是说仅应替换 PATTERN 之后的文字“xy z”行。
awk '
/PATTERN/ { f=1 }
f && /x y z/ { print $0, 1 ; next }
{ print }
'
如果它是具有三个任意字段的行,则使用
awk '
/PATTERN/ { f=1 }
f && NF==3 { print $0, 1 ; next }
{ print }
'