为什么 uniq 似乎保留一些连续相同的行?

为什么 uniq 似乎保留一些连续相同的行?

没有 uniq:

amin@ubuntu:~/Desktop$ cut -f 1 info.log | tail -n +2 | head -n -1 | sort
Abol
Abol 
Ahmad
Akbar
Arash
Hadi 
Hamed
Mahmood
Maryam
Maryam
Mohsen
NIma
Rasool
Sadegh
Sepide
Sepide 

使用 uniq:

amin@ubuntu:~/Desktop$ cut -f 1 info.log | tail -n +2 | head -n -1 | sort | uniq
Abol
Abol 
Ahmad
Akbar
Arash
Hadi 
Hamed
Mahmood
Maryam
Mohsen
NIma
Rasool
Sadegh
Sepide
Sepide 

如您所见,两者的结果相同,为什么?

答案1

TL;DR:各行末尾有不同的空白(可能是空格)。

这种情况发生在您有几行看起来相同但实际上不同的行,因为终端中不显示字符(通常在末尾)。通常这些是尾随空格(如fkraiem建议)或不一致行终止符

您可能认为使用 启动管道(正如您所做的那样cut)可以防止这种情况发生。但事实并非如此。cut使用制表符作为其默认分隔符。(希望验证此行为(以及它与 -- 之后出现意外重复行的相关性)的读者可以uniq尝试cut -f 1 <<<$'foo\nfoo ' | uniq,它会打印两行。)

您的解决方案可能是使用除cut -f 1选择字段之外的其他方法。特别是,如果字段由空格而不是制表符分隔(无论是单个空格还是多个空格,即使不同记录中的空格数不同),那么您可以使用cut -d' ' -f 1,指定空格作为分隔符。或者您可能cut根本不想使用,而是使用awk '{ print $1 }',它将打印第一个字段,以任何连续的空格和制表符序列作为分隔符。

您也可以删除尾随空格,但这会使命令更加复杂。一种方法是在文本sed -E 's/[[:space:]]+$//'到达 之前将其通过管道传输uniq

附注:如果您最终使用的任何命令最终仍将 的输出sort直接传输到uniq,那么您可以考虑只使用sort -u

相关内容