尝试使用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
我希望得到这个输出
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
执行此代码:
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
有人可以帮我吗?
NF=NF
是什么意思,它只能放在开头吗? - The fourth birdNF = NF
与其他人使用的$1=$1
相同,但您可以在控制台终端中安全地键入它,不用加引号。mawk
将命令行赋值视为反斜杠,而gawk
和nawk
则像主代码中的任何双引号字符串一样处理它们,因此需要双反斜杠,正如您可以在FS
的2个不同变体中看到的那样。如果您将NF=NF
之后的任何内容放在其左侧,则还必须添加-v
标志前缀,例如-v OFS=…
。在主代码之后执行此操作可跳过该部分,但这些部分会被处理... - RARE Kpop ManifestoBEGIN { }
段落之后,但在NR == 1
之前设置RS
为空意味着所有没有完全空白行分隔的输入块将一次性处理,并且我只是交换了FS
和RS
的角色,并使用FS + OFS
来解决格式问题。因此,这些解决方案适用于不连续地输入的情况。 - RARE Kpop Manifesto$1 = $1
实际上是一个有问题的形式。echo ' abc xyz ' | mawk '$1=$1' FS='[ ]+'
打印出来的是绝对什么都没有,因为$1
实际上是一个空字符串,而"abc"
位于$2
。这个赋值等同于执行$1 = ""
,这意味着该模式将一个空字符串评估为布尔值FALSE
,因此不执行默认操作{ print }
。NF=NF
修复了这个问题,但要记住它仍然跳过空行,因为NF
为零。 - RARE Kpop Manifesto