没有 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
。