awk 命令:如果行不以字符开头,则删除前行的新行

Luc*_*a L 7 unix string awk data-manipulation

尝试使用 awk 命令来实现此规则:如果行不以“O|”开头 或“A|” 或“S|” 我想删除前一行的新行

我在输入中有这个文件(input.txt)

O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2
O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2
Run Code Online (Sandbox Code Playgroud)

我想要这个输出

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
Run Code Online (Sandbox Code Playgroud)

执行这段代码

awk '/^O\|/ || /^A\|/ || /^S\|/ {printf "%s", $0; next} 1 {print}' input.txt > output.txt

它返回

O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

anu*_*ava 4

awk应该适合你:

awk -F'|' 'NF==3 && $3 == "" {p = $0; next}
      {print (NF == 1 ? p $1 : $0); p = ""}' file

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
Run Code Online (Sandbox Code Playgroud)