Come rimuovere le righe duplicate con awk mantenendo le righe vuote?


13

Il awkcomando seguente rimuove tutte le righe duplicate come spiegato qui :

awk '!seen[$0]++'

Se il testo contiene righe vuote, verranno eliminate tutte le righe tranne una.

Come posso mantenere tutte le righe vuote eliminando tutte le righe duplicate non vuote, usando solo awk? Per favore, includi anche una breve spiegazione.

Risposte:


28

Un'altra opzione è quella di verificare NF, ad esempio:

awk '!NF || !seen[$0]++'

11

In alternativa

awk '!/./ || !seen[$0]++' file

Il trucco principale è lo stesso, seen[$0]++crea una voce seennell'array associativo la cui chiave è la linea corrente ( $0). Pertanto, !seen[$0]++sarà falso se questa linea è già stata vista. La /./sta verificando se la riga contiene tutti i caratteri non vuoti, quindi !/./soddisfa le righe non vuote. Combinato con || !seen[$0]++esso ignorerà tutte le righe duplicate tranne quelle vuote e stamperà il resto.


Penso che questa dovrebbe essere la risposta accettata. +1 per spiegazione!
SS Anne,

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

Tutto quello che devi fare è verificare prima che sia presente una riga vuota (davvero vuota o semplicemente vuota).


5

Ecco un'altra awksoluzione, simile alla risposta di @ Thor, meno concisa ma più efficiente:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

Con questo, controlliamo solo che a[$0]esiste o no. In caso contrario, inizializzalo quindi stampa. In questo caso, non abbiamo alcun riferimento, assegnazione a a[$0]se esistesse.


Non ho misurato alcuna differenza di tempo significativa con il mio file di test a 288 righe. Tuttavia, il tuo codice ottiene sicuramente il premio per essere il più leggibile.
Serge Stroobandt,
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.