我想从 中删除重复的行/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