uniq命令无法正常工作?


22

所以我正在检查md5文件的哈希,并以此作为输出:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

但是,在find . -type f -exec md5sum '{}' ';' | uniq -w 33找到唯一的哈希之后,我得到了:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

根据我的理解,因为它们的哈希值相同,所以其中一个derpina.txt或一个都derp.txt应该只出现。我想念什么吗?有人能启发我为什么会这样输出吗?


1
弄清楚了。显然,除非相邻行重复,否则uniq不会检测到重复行。链接到答案,帮助我stackoverflow.com/questions/23114677/...
user2127726

Answers:


48

您需要使用sort之前uniq

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniq仅删除重复的行。它不会对寻找重复的行进行重新排序。 sort做那部分。

记录在man uniq

注意:“ uniq”不会检测重复的行,除非它们相邻。您可能要先对输入进行排序,或者使用sort -u' withoutuniq'。


uniqsort -u在所有系统中,默认情况下都应使用别名。如果有的话,它总是需要“排序”才能正常工作。
Devaroop

这种变化将减少一些混乱。另一方面,uniq具有的许多功能不可用sort -u。此外,还有一个地方要使用的情况下uniq没有sort
John1024

5

uniq需要对输入进行排序。因此,对于示例案例,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

会工作。在-w--check-chars=N)使得仅关于第一列的唯一的线; 此选项适用于这种情况。但是指定该行相关部分的可能性uniq是有限的。例如,没有任何选项指定在第3列和第5列上工作,而忽略第4列。

该命令sort本身具有用于唯一输出行的选项,并且这些行对于用于排序的键是唯一的。这意味着我们可以利用强大的key语法sort定义线应该是uniq的哪一部分。

例如

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

给出相同的结果,但该sort零件对于其他用途更为灵活。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.