我正在尝试获取一个名为“输入”的文本文件,其形式为
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 }
'