没有唯一性:
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
使用独特的:
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
如您所见,两者的结果相同,为什么?
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
for 。