如何删除重复行并忽略制表符或空格

如何删除重复行并忽略制表符或空格

我想从 中删除重复的行/etc/fstab,所以我这样做了:

 awk '!NF || !seen[$0]++'   /etc/fstab > /etc/fstab.update

UUID=3de0d101-fba7-4d89-b038-58fe07295d96 /grid/sdb ext4 defaults,noatime 0 0
UUID=683ed0b3-51fe-4dc4-975e-d56c0bbaf0bc /grid/sdc ext4 defaults,noatime 0 0
UUID=1cf79946-0ba6-4cd8-baca-80c0a2693de1 /grid/sdd ext4 defaults,noatime 0 0
UUID=fa9cc6e8-4df8-4330-9144-ede46b94c49e /grid/sde ext4 defaults,noatime 0 0
UUID=3de0d101-fba7-4d89-b038-58fe07295d96   /grid/sdb                      ext4 defaults,noatime 0 0
UUID=683ed0b3-51fe-4dc4-975e-d56c0bbaf0bc   /grid/sdc                      ext4 defaults,noatime 0 0

但我们可以看到,最后两行与前两行相同,但最后两行有空格。

是否可以忽略空格并删除重复的行?

答案1

强制重建记录$1=$1!这将所有连续的空间压缩为一个空间。

awk '{$1=$1};!seen[$0]++'

答案2

用于tr将制表符替换为空格并挤压重复 ( -s):

 tr -s $'\t' ' ' < /etc/fstab | awk '!NF || !seen[$0]++' > /etc/fstab.update

答案3

使用此 Perl 单行代码将任意数量的空白视为单个空白:

perl -lane 'print unless $seen{"@F"}++' in.txt > out.txt

如果您想完全忽略空格,请使用:

perl -lane '$s = join "", @F; print unless $seen{$s}++' in.txt > out.txt

Perl 单行代码使用以下命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-n:一次循环输入一行,$_默认将其分配给。 :在内联执行代码之前
-l剥离输入行分隔符(默认在 *NIX 上),并在打印时附加它。 :按空格或选项中指定的正则表达式拆分为数组。"\n"
-a$_@F-F

也可以看看:
perldoc perlrun:如何执行Perl解释器:命令行开关

相关内容