perintah uniq tidak berfungsi dengan baik?

22

Jadi saya memeriksa md5hash file saya dengan ini sebagai output saya:

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

Namun, setelah berlari find . -type f -exec md5sum '{}' ';' | uniq -w 33untuk menemukan hash unik saya mendapatkan ini:

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

Dari pemahaman saya, hanya satu dari salah satu derpina.txtatau derp.txtharus muncul karena hash mereka sama. Apakah saya melewatkan sesuatu? Adakah yang bisa menjelaskan mengapa ini menghasilkan seperti ini?

pengguna2127726
sumber
1
Menemukannya. Rupanya uniq tidak mendeteksi garis yang berulang kecuali jika berdekatan. Tautan ke jawaban yang membantu saya stackoverflow.com/questions/23114677/…
user2127726

Jawaban:

48

Anda perlu menggunakan sortsebelum uniq:

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

uniqhanya menghilangkan garis yang berulang. Itu tidak memesan ulang garis mencari pengulangan. sortapakah bagian itu.

Ini didokumentasikan dalam man uniq:

Catatan: 'uniq' tidak mendeteksi garis yang berulang kecuali jika berdekatan. Anda mungkin ingin mengurutkan input terlebih dahulu, atau menggunakan sort -u' withoutuniq '.

John1024
sumber
uniqharus alias sebagai sort -udefault di semua sistem. Jika sama sekali selalu perlu "mengurutkan" agar berfungsi dengan benar.
Devaroop
Perubahan itu akan mengurangi kebingungan. Di sisi lain, uniqmemiliki banyak fitur yang tidak tersedia sort -u. Juga, ada beberapa kasus di mana seseorang ingin menggunakannya uniqtanpa sort.
John1024
5

Input untuk uniqperlu disortir. Jadi untuk contoh kasus,

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

akan bekerja. The -w( --check-chars=N) membuat garis-garis unik hanya pada kolom pertama; Opsi ini berfungsi untuk kasus ini. tetapi kemungkinan untuk menentukan bagian yang relevan dari garis untuk uniqterbatas. Misalnya, tidak ada opsi untuk menentukan bekerja pada beberapa kolom 3 dan 5, mengabaikan kolom 4.

Perintah sortmemiliki opsi untuk jalur output unik itu sendiri, dan jalur tersebut unik terkait dengan kunci yang digunakan untuk mengurutkan. Ini berarti kita dapat menggunakan sintaks kunci yang kuat sortuntuk mendefinisikan tentang bagian mana yang harus uniq.

Sebagai contoh,

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

memberikan hasil yang sama, tetapi sortbagian ini lebih fleksibel untuk kegunaan lain.

Volker Siegel
sumber