根据条件在 awk 中添加一个空行

tho*_*ton 5 awk text-processing

大家早上好,

我想用空行来划分文件的匹配行组。作为 awk 的新手,我做了一些修改并想出了这个:

awk '!($0 in a) {print "\n"; a[$0]}; {print}'
Run Code Online (Sandbox Code Playgroud)

在我的脑海中读作

如果当前行不在数组“a”中,则打印换行符并将该行添加到“a”中。打印当前行。

如果我对测试文件运行它,输出看起来像



abc
abc


def
def
def


ghi

Run Code Online (Sandbox Code Playgroud)

即打印了两行空行而不是一行。多余的线从哪里来?

这是我使用的测试文件:

abc
abc
def
def
def
ghi
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 5

您不需要关联的数组:

awk 'prev!=""{ print prev!=$0? prev ORS : $0 } { prev=$0 }
END{ if(prev!="") print prev }' infile
Run Code Online (Sandbox Code Playgroud)

输出:

abc
abc

def
def
def

ghi
Run Code Online (Sandbox Code Playgroud)

关于为什么你awk打印换行符两次是因为你正在使用print语句,默认情况下它打印你正在打印的内容+ ORS(输出记录分隔符,默认为换行符),你需要使用而printf "\n"不是或只是print ""; 并使用您自己的解决方案,您可以执行以下操作(应用一些修复):

awk '!($0 in a) { if(c++) print "" } { a[$0]; print}' infile
Run Code Online (Sandbox Code Playgroud)

或更紧凑:

awk '!($0 in a) && c++{ print ""} ++a[$0]' infile
Run Code Online (Sandbox Code Playgroud)