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)
您不需要关联的数组:
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)