Come utilizzare il comando uniq su Linux

Un prompt della shell su un computer Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Linux uniq il comando scorre i file di testo alla ricerca di righe univoche o duplicate. In questa guida, descriviamo la sua versatilità e funzionalità, oltre a come sfruttare al meglio questa utilissima utility.

Trovare linee di testo corrispondenti su Linux

Il uniq il comando è veloce, flessibile e ottimo in quello che fa. Tuttavia, come molti comandi di Linux, ha alcune stranezze, il che va bene, purché tu ne sia a conoscenza. Se ti immergi senza un po 'di know-how interno, potresti essere lasciato a grattarti la testa per i risultati. Indicheremo queste stranezze mentre procediamo.

Il uniq il comando è perfetto per coloro che sono nel campo unico, progettato per fare una cosa sola e farlo bene. Questo è il motivo per cui è anche particolarmente adatto per lavorare con le pipe e per fare la sua parte nelle pipeline di comando. Uno dei suoi collaboratori più frequenti è sort perché uniq deve disporre di input ordinati su cui lavorare.

Accendiamolo!

RELAZIONATO: Come usare le pipe su Linux

Esecuzione di uniq senza opzioni

Abbiamo un file di testo che contiene i testi della canzone di Robert Johnson Credo che spolvererò la mia scopa. Vediamo cosa uniq ne fa.

Digiteremo quanto segue per reindirizzare l'output less:

uniq dust-my-broom.txt | less

Il comando "uniq dust-my-broom.txt | less" in una finestra del terminale.

Otteniamo l'intero brano, comprese le linee duplicate, in less:

L'output del comando "uniq dust-my-broom.txt | less" in meno in una finestra del terminale.

Ciò non sembra essere né le linee uniche né le linee duplicate.

Giusto, perché questa è la prima stranezza. Se corri uniq senza opzioni, si comporta come se avessi usato il -u (linee uniche) opzione. Questo dice uniq per stampare solo le righe univoche dal file. Il motivo per cui vengono visualizzate righe duplicate è perché, per uniq per considerare una linea un duplicato, deve essere adiacente al suo duplicato, che è dove sort entra.

Quando ordiniamo il file, raggruppa le righe duplicate e uniq li tratta come duplicati. Useremo sort sul file, reindirizzare l'output ordinato in uniqe quindi reindirizzare l'output finale in less.

Per fare ciò, digitiamo quanto segue:

sort dust-my-broom.txt | uniq | less

Il comando "ordina dust-my-broom.txt | uniq | less" in una finestra terminale.

Viene visualizzato un elenco ordinato di righe less.

Uscita dall'ordinamento dust-my-broom.txt | uniq | meno in meno in una finestra terminale

La frase “Credo che mi spolvererò la scopa” appare definitivamente nella canzone più di una volta. In effetti, si ripete due volte nelle prime quattro righe della canzone.

Quindi, perché viene visualizzato in un elenco di linee uniche? Perché la prima volta che appare una riga nel file, è unica; solo le voci successive sono duplicate. Puoi pensarlo come elencando la prima occorrenza di ogni riga univoca.

Usiamo sort di nuovo e reindirizzare l'output in un nuovo file. In questo modo, non dobbiamo usare sort in ogni comando.

Digitiamo il seguente comando:

sort dust-my-broom.txt > sorted.txt

Il comando "ordina dust-my-broom.txt> sort.txt" in una finestra del terminale.

Ora, abbiamo un file preordinato con cui lavorare.

Conteggio dei duplicati

Puoi usare il -c (conta) opzione per stampare il numero di volte in cui ogni riga appare in un file.

Digita il seguente comando:

uniq -c sorted.txt | less

Il comando "uniq -c sort.txt | less" in una finestra del terminale.

Ogni riga inizia con il numero di volte che la riga appare nel file. Tuttavia, noterai che la prima riga è vuota. Questo ti dice che ci sono cinque righe vuote nel file.

Output dal comando "uniq -c sort.txt | less" in less in una finestra terminale.

Se si desidera che l'output sia ordinato in ordine numerico, è possibile alimentare l'output da uniq in sort. Nel nostro esempio, useremo il -r (retromarcia) e -n (ordinamento numerico) e reindirizza i risultati less.

Digitiamo quanto segue:

uniq -c sorted.txt | sort -rn | less

Il comando "uniq -c sort.txt | sort -rn | less" in una finestra terminale.

L'elenco è ordinato in ordine decrescente in base alla frequenza dell'aspetto di ciascuna riga.

Output da uniq -c sort.txt | ordina -rn | meno in meno in una finestra terminale

Elenco solo righe duplicate

Se vuoi vedere solo le righe che si ripetono in un file, puoi usare -d (ripetuta) opzione. Non importa quante volte una riga viene duplicata in un file, viene elencata una sola volta.

Per utilizzare questa opzione, digitiamo quanto segue:

uniq -d sorted.txt

Il comando "uniq -d sort.txt" in una finestra del terminale.

Le linee duplicate sono elencate per noi. Noterai la riga vuota in alto, il che significa che il file contiene righe vuote duplicate: non è uno spazio lasciato da uniq per compensare esteticamente l'elenco.

Output dal comando "uniq -d sort.txt" in una finestra del terminale.

Possiamo anche combinare il -d (ripetuto) e -c (conta) opzioni e reindirizza l'output sort. Questo ci dà un elenco ordinato delle linee che appaiono almeno due volte.

Digitare quanto segue per utilizzare questa opzione:

uniq -d -c sorted.txt | sort -rn

Il comando "uniq -d -c sort.txt | sort -rn" in una finestra del terminale.

Elenco di tutte le linee duplicate

Se si desidera visualizzare un elenco di ogni riga duplicata, nonché una voce ogni volta che una riga appare nel file, è possibile utilizzare il -D (tutte le righe duplicate) opzione.

Per utilizzare questa opzione, digitare quanto segue:

uniq -D sorted.txt | less

Il comando "uniq -D Sort.txt | less" in una finestra del terminale.

L'elenco contiene una voce per ogni riga duplicata.

Output da uniq -D Sort.txt | meno in meno in una finestra terminale

Se si utilizza il --group opzione, stampa ogni riga duplicata con una riga vuota prima (prepend) o dopo ciascun gruppo (append) o entrambi prima e dopo (both) ciascun gruppo.

Stiamo usando append come nostro modificatore, quindi digitiamo quanto segue:

uniq --group=append sorted.txt | less

Il comando "uniq --group = append sort.txt | less" in una finestra del terminale.

I gruppi sono separati da righe vuote per facilitarne la lettura.

Output del comando "uniq --group = append sort.txt | less" in less in una finestra terminale.

Verifica di un certo numero di personaggi

Di default, uniq controlla l'intera lunghezza di ogni riga. Se si desidera limitare i controlli a un determinato numero di caratteri, tuttavia, è possibile utilizzare il -w (controlla i caratteri) opzione.

In questo esempio, ripeteremo l'ultimo comando, ma limiteremo i confronti ai primi tre caratteri. Per fare ciò, digitiamo il seguente comando:

uniq -w 3 --group=append sorted.txt | less

Il comando "uniq -w 3 --group = append sort.txt | less" in una finestra terminale.

I risultati e i raggruppamenti che riceviamo sono abbastanza diversi.

Output dal comando "uniq -w 3 --group = append sort.txt | less" in una finestra terminale.

Tutte le linee che iniziano con “I b” sono raggruppate perché quelle parti delle linee sono identiche, quindi sono considerate duplicate.

Allo stesso modo, tutte le righe che iniziano con “I am” sono trattate come duplicati, anche se il resto del testo è diverso.

Ignorando un certo numero di personaggi

Ci sono alcuni casi in cui potrebbe essere utile saltare un certo numero di caratteri all'inizio di ogni riga, come quando le linee in un file sono numerate. Oppure, dì che hai bisogno uniq per saltare su un timestamp e iniziare a controllare le linee dal carattere sei anziché dal primo carattere.

Di seguito è riportata una versione del nostro file ordinato con righe numerate.

Un file numerato e ordinato di righe duplicate in meno in una finestra terminale.

Se vogliamo uniq per iniziare i controlli di confronto al terzo carattere, possiamo usare il -s (salta caratteri) digitando quanto segue:

uniq -s 3 -d -c numbered.txt

Il comando "uniq -s 3 -d -c numbered.txt" in una finestra del terminale.

Le linee vengono rilevate come duplicate e contate correttamente. Si noti che i numeri di riga visualizzati sono quelli della prima occorrenza di ciascun duplicato.

Puoi anche saltare i campi (una serie di caratteri e alcuni spazi bianchi) anziché i caratteri. Useremo il -f (campi) opzione da dire uniq quali campi ignorare.

Digitiamo quanto segue per dirlo uniq per ignorare il primo campo:

uniq -f 1 -d -c  numbered.txt

Il comando "uniq -f 1 -d -c numbered.txt" in una finestra del terminale.

Otteniamo gli stessi risultati che abbiamo fatto quando l'abbiamo detto uniq per saltare tre caratteri all'inizio di ogni riga.

Caso ignorante

Di default, uniq è sensibile al maiuscolo / minuscolo. Se la stessa lettera appare in maiuscolo e in minuscolo, uniq considera le linee diverse.

Ad esempio, controlla l'output dal seguente comando:

uniq -d -c sorted.txt | sort -rn

Il comando "uniq -d -c sort.txt | sort -rn" e l'output in una finestra terminale.

Le righe “Credo che spolvererò la mia scopa” e “Credo che spolvererò la mia scopa” non sono trattate come duplicati a causa della differenza nel caso in cui “B” in “credi”.

Se includiamo il -i (ignora caso), tuttavia, queste righe saranno trattate come duplicati. Digitiamo quanto segue:

uniq -d -c -i sorted.txt | sort -rn

Il comando "uniq -d -c -i sort.txt | sort -rn" in una finestra terminale.

Le linee sono ora trattate come duplicati e raggruppate insieme.


Linux mette a tua disposizione una moltitudine di utility speciali. Come molti di loro, uniq non è uno strumento che utilizzerai ogni giorno.

Ecco perché gran parte del diventare esperti in Linux sta ricordando quale strumento risolverà il tuo attuale problema e dove lo potrai ritrovare. Se ti alleni, però, sarai sulla buona strada.

Oppure, puoi sempre cercare How-To Geek, probabilmente abbiamo un articolo su di esso.

Articoli correlati

Ultimi articoli