2010-08-01 14 views
36

Qual è la differenza tra i seguenti comandi?Ordina e uniq in shell Linux

sort -u FILE 

sort FILE | uniq 
+0

Quando li hai eseguiti, cosa hai visto? Hai provato a raccogliere differenze temporali per file di dimensioni diverse? Potresti eseguire alcuni esperimenti e pubblicare i risultati come parte della tua domanda. –

+0

Voglio sapere se c'è un caso particolare in cui entrambi i comandi si comportano diversamente, in una normale esecuzione entrambi danno gli stessi risultati – yassin

+3

[Qual è la differenza tra "sort -u" e "sort | uniq "?] (http://unix.stackexchange.com/q/76049/17265) – mtk

risposta

59

L'utilizzo di sort -u fa meno I/O rispetto a sort | uniq, ma il risultato finale è lo stesso. In particolare, se il file è abbastanza grande da consentire a sort di creare file intermedi, c'è una discreta possibilità che lo sort -u utilizzi file intermedi leggermente più piccoli o leggermente più piccoli in quanto potrebbe eliminare i duplicati mentre ordina ogni set. Se i dati sono altamente duplicativi, ciò potrebbe essere utile; se ci sono pochi duplicati, infatti, non farà molta differenza (sicuramente un effetto di performance del secondo ordine, rispetto all'effetto del primo ordine del tubo).

Si noti che ci sono momenti in cui le tubazioni sono appropriate. Per esempio:

sort FILE | uniq -c | sort -n 

Questa ordina il file in ordine del numero di occorrenze di ogni riga del file, con le linee più ripetuti apparire scorso. (Non mi sorprenderebbe scoprire che questa combinazione, che è idiomatica per Unix o POSIX, può essere schiacciata in un complesso comando di "ordinamento" con ordinamento GNU.)

Ci sono momenti in cui non si usa il tubo è importante . Ad esempio:

sort -u -o FILE FILE 

Questo ordina il file "in situ"; ovvero, il file di output è specificato da -o FILE e questa operazione è sicura (il file viene letto prima di essere sovrascritto per l'output).

+0

Grazie per la risposta completa! – yassin

+0

l'ordinamento di gnu non ha un modo per fare tutto di 'sort | uniq -c | sort -n', e nemmeno ho trovato nessun altro strumento per farlo in modo efficiente. Sembra una cosa utile da programmare. – mc0e

2

Niente, produrranno lo stesso risultato

10

C'è una leggera differenza: codice di ritorno.

Il problema è che, a meno che non sia impostato shopt -o pipefail, il codice di ritorno del comando inviato sarà il codice di ritorno dell'ultimo. E uniq restituisce sempre zero (esito positivo). Provate esaminando il codice di uscita, e vedrete qualcosa di simile (pipefail non è impostato qui):

[email protected] ~ $ sort -u file_that_doesnt_exist ; echo $? 
sort: open failed: file_that_doesnt_exist: No such file or directory 
2 
[email protected] ~ $ sort file_that_doesnt_exist | uniq ; echo $? 
sort: open failed: file_that_doesnt_exist: No such file or directory 
0 

Oltre a questo, i comandi sono equivalenti.

0

Ho lavorato su alcuni server in cui l'ordinamento non supporta l'opzione '-u'. ci dobbiamo usare

sort xyz | uniq 
+1

Ti piacerebbe specificare quali server con quale versione o/s e quando, all'incirca? La settima edizione UNIX ™ 'sort' supportava' -u' e quella era la prima versione ampiamente utilizzata di UNIX, quindi tutti gli altri (System III, System V, BSD, ecc.) Tendevano a seguirlo, quindi sarei davvero sorpreso per trovare un sistema simile a Unix dove 'sort' non supporta' -u'. –

6

Beware! Se è vero che "sort -u" e "sort | uniq" sono equivalenti, qualsiasi opzione aggiuntiva da ordinare può rompere l'equivalenza. Ecco un esempio del manuale di coreutils:

Ad esempio, 'sort -n -u' controlla solo il valore della stringa numerica iniziale quando verifica l'univocità, mentre 'ordina -n | uniq 'ispeziona l'intera linea.

Analogamente, se si ordina sui campi chiave, il test di univocità utilizzato dall'ordinamento non esaminerà necessariamente l'intera riga.Dopo essere stato morso da quel bug in passato, in questi giorni tendo ad usare "sort | uniq" quando scrivo gli script di Bash. Preferisco avere un sovraccarico di I/O più alto di quello che corre il rischio che qualcun altro nel negozio non sappia di quel particolare trabocchetto quando modificano il mio codice per aggiungere ulteriori parametri di ordinamento.