Come impedire a grep di stampare più volte la stessa stringa?


14

Se grep un file contenente quanto segue:

These are words
These are words
These are words
These are words

... per la parola These, stamperà la stringa These are wordsquattro volte.

Come posso impedire a grep di stampare più volte stringhe ricorrenti? Altrimenti, come posso manipolare l'output di grep per rimuovere le linee duplicate?


L'ordine delle partite deve essere mantenuto nell'output? In caso contrario, il comando inviato da John1024 funzionerà.
kos,

Risposte:


21

La filosofia Unix è quella di avere strumenti che facciano una cosa e li facciano bene. In questo caso, grepè lo strumento che seleziona il testo da un file. Per scoprire se ci sono duplicati, si ordina il testo. Per rimuovere i duplicati, si usa l' -uopzione per sort. Così:

grep These filename | sort -u

sortha molte opzioni: vedi man sort. Se vuoi contare i duplicati o hai uno schema più complicato per determinare cosa è o non è un duplicato, allora invia l'output di ordinamento a uniq: grep These filename | sort | uniqe vedi manuniq` per le opzioni.


2

Utilizzo grepe un interruttore aggiuntivo, se stai cercando una sola stringa

grep -m1 'These' filename

A partire dal man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

o usando awk ;)

awk '/These/ {print; exit}' foo

IMHO la risposta più appropriata è il flag -m. Ti suggerisco di metterlo in cima alla tua risposta. Ottima risposta!
Sergiy Kolodyazhnyy,

3
Questo non funzionerà se stai usando un regex - si fermerà immediatamente dopo il primo incontro, non assicurati di ottenere uno e solo uno di ogni possibile incontro.
CSV,
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.