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

yae*_*ael 4 sed awk perl text-processing

我想从 中删除重复的行/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
Run Code Online (Sandbox Code Playgroud)

但是我们可以看到,最后两行和前两行是一样的,只是最后两行有空格。

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

Qua*_*odo 13

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

awk '{$1=$1};!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)


pLu*_*umo 6

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

 tr -s $'\t' ' ' < /etc/fstab | awk '!NF || !seen[$0]++' > /etc/fstab.update
Run Code Online (Sandbox Code Playgroud)


Tim*_*and 5

使用这个 Perl one-liner 将任意数量的空白视为单个空白:

perl -lane 'print unless $seen{"@F"}++' in.txt > out.txt
Run Code Online (Sandbox Code Playgroud)

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

perl -lane '$s = join "", @F; print unless $seen{$s}++' in.txt > out.txt
Run Code Online (Sandbox Code Playgroud)

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

还请参见
perldoc perlrun::如何执行 Perl 解释器:命令行开关