在模式后使用 awk 附加输入文件(循环?)

在模式后使用 awk 附加输入文件(循环?)

我正在尝试获取一个名为“输入”的文本文件,其形式为

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 }
'

相关内容