comando uniq non funziona correttamente?


22

Quindi sto controllando l' md5hash dei miei file con questo come output:

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

Tuttavia, dopo l'esecuzione find . -type f -exec md5sum '{}' ';' | uniq -w 33per trovare gli hash unici ottengo questo:

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

Secondo la mia comprensione, solo uno di uno derpina.txto derp.txtdovrebbe presentarsi poiché i loro hash sono gli stessi. Mi sto perdendo qualcosa? Qualcuno può illuminarmi sul perché produce in questo modo?


1
Capito. Apparentemente uniq non rileva le linee ripetute a meno che non siano adiacenti. Link alla risposta che mi ha aiutato a stackoverflow.com/questions/23114677/...
user2127726

Risposte:


49

È necessario utilizzare sortprima di uniq:

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

uniqrimuove solo le linee ripetute. Non riordina le linee in cerca di ripetizioni. sortfa quella parte.

Questo è documentato in man uniq:

Nota: 'uniq' non rileva le linee ripetute a meno che non siano adiacenti. Potresti prima ordinare l'input o usare sort -u' withoutuniq '.


uniqdovrebbe essere modificato come sort -uimpostazione predefinita in tutti i sistemi. Se mai ha sempre bisogno di "ordinamento" per funzionare correttamente.
Devaroop,

Quel cambiamento ridurrebbe un po 'di confusione. D'altra parte, uniqha molte funzionalità non disponibili con sort -u. Inoltre, ci sono casi in cui si vuole usare uniqsenza sort.
Giovanni 1024,

5

L'input per uniqdeve essere ordinato. Quindi, per esempio,

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

funzionerebbe. Il -w( --check-chars=N) rende le righe uniche solo per quanto riguarda la prima colonna; Questa opzione funziona per questo caso. ma le possibilità di specificare le parti pertinenti della linea peruniq sono limitate. Ad esempio, non ci sono opzioni per specificare di lavorare su alcune colonne 3 e 5, ignorando la colonna 4.

Il comando sortha un'opzione per le linee di output uniche e le linee sono uniche per quanto riguarda le chiavi utilizzate per l'ordinamento. Questo significa che possiamo usare la potente sintassi chiave sortper definire riguardo a quale parte le linee dovrebbero essere uniq.

Per l'esempio,

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

dà esattamente lo stesso risultato, ma la sortparte è più flessibile per altri usi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.