Bash Unix Shell脚本:删除行中的重复项忽略空行

Bash Unix Shell脚本:删除行中的重复项忽略空行,bash,shell,unix,awk,sh,Bash,Shell,Unix,Awk,Sh,如何在忽略空白行的情况下从txt文件中“删除”重复行?我想在行中添加前缀/(注释),而不是删除 我从搜索中发现这个命令awk'!x[$0]+'将删除文件中的所有重复行以及空行。如果可能的话,对awk命令进行修改将是非常好的 原始输入: foo bar cat dog turtle cat bar lion bear bird fish cat 输出: foo bar cat dog turtle // cat // bar lion bear bird // lion bird 只需

如何在忽略空白行的情况下从txt文件中“删除”重复行?我想在行中添加前缀
/
(注释),而不是删除

我从搜索中发现这个命令
awk'!x[$0]+'
将删除文件中的所有重复行以及空行。如果可能的话,对
awk
命令进行修改将是非常好的

原始输入:

foo
bar
cat

dog
turtle
cat
bar
lion
bear

bird
fish
cat
输出:

foo
bar
cat

dog
turtle
// cat
// bar
lion
bear

bird
// lion
bird

只需忽略空白换行符和这里有一种使用
awk
的方法:

$ awk 'NF{x[$0]++; print (x[$0]>1?"//"$0:$0); next}1' file
foo
bar
cat

dog
turtle
//cat
//bar
lion
bear

bird
fish
//cat

NF
告诉awk仅对非空行执行操作。我们增加数组
x
,将每一行存储为键。如果计数大于1,则打印带有
/
前缀的行,否则只按原样打印行<代码> 1 允许我们保留空行。 添加一些示例输入数据和所需的输出。您的输出与输入不同步,尤其是最后三行。我添加了一个解决方案,希望这是您想要的。@jaypal非常感谢您,先生。你的解决方案真是太棒了。太好了!这个解释可以再好一点
NF
相当于
NF>0
,因此,如果至少有一个字段,则执行大括号中的代码,其中包括
next
,这样就不会执行更多的代码。如果字段数为
0
,则执行第二个代码块,这是一个非零值(任何非零值都可以),解释为true,并执行默认的打印操作。@jaypal抱歉。不完全一样。那一条想删除,这一条评论。也就是说,你的awk答案总是很有启发性的。你可以把它缩短一点,例如:
NF&&x[$0]+{$0=“/”$0}1