Cum elimini linile duplicate dintr-un fișier folosind ‘awk’?

Destul de des folosesc ziduri de conținut luate cu copy/paste din care trebuie să elimin duplicatele.

Există soluții online, destul de limitate, și există și câteva editoare de text care fac treaba asta.

Totuși, adeseori, utilizarea unor editoare de text doar pentru o astfel de funcționalitate e cam overkill așa că am dat peste o soluție simplă folosind ‘awk‘.

Să presupunem că avem un fișier numit sursa în care avem câteva zeci de mii de linii și vrem să eliminăm duplicatele fără să facem vreun fel de sortare utilizând ‘sort‘ și ‘uniq‘, comenzi pe care de altfel le utilizez destul de des atunci când am nevoie și de sortare.

Cu ‘awk‘ putem să utilizăm comanda de mai jos pentru a crea un array asociativ (o hartă):

awk '!visited[$0]++' sursa > destinatie

Astfel ‘awk‘ folosește un raționament boolean pentru a verifica dacă o linie din același array a mai fost identificată anterior și dacă găsește un duplicat atunci elimă linia din buffer și trece mai departe.

Folosind comanda de mai sus nu se modifică deloc ordinea în care sunt enumerate linile.

Totuși dacă ordinea în sine nu e importantă, același rezultat îl putem obține și folosind comanda ‘sort‘ de care am amintit mai sus:

sort -u sursa > destinatie

Atributul ‘-u‘ asigură unicitatea output-ului, dar comanda ‘sort‘ o să sorteze conținutul în ordine alfabetică și numerică.

Există și alternative fiindcă o combinație de comenzi poate să revertească sortarea implicită astfel:

cat -n sursa | sort -uk2 | sort -nk1 | cut -f2- > destinatie

Astfel, atributul ‘-n‘ de după comanda ‘cat‘ numerotează fiecare linie a output-ului, apoi atributul ‘-uk2‘ de după prima comanda ‘sort’ elimină duplicatele și output-ul rezultat trece din nou printr-o sortare care folosind numerotarea anterioară re-așează rezultatele datorită atributului ‘-nk1‘ apoi, comada cut și atributul aferent elimină numerotarea.

Referințe:

Lunarpages Internet Solutions