Master Linux uniq-kommandoen: Finn & fjern duplikater effektivt!

Linux-kommandoen uniq analyserer tekstfilene dine for å identifisere unike eller gjentatte linjer. Denne veiledningen utforsker allsidigheten og funksjonene, og viser hvordan du kan utnytte dette praktiske verktøyet maksimalt.

Oppdagelse av like tekstlinjer i Linux

uniq-kommandoen er effektiv, tilpasningsdyktig og spesialdesignet for oppgaven. Som mange Linux-kommandoer har den visse særegenheter som det er greit å være klar over. Uten denne forkunnskapen kan det fort oppstå forvirring. Vi vil avklare disse særegenhetene underveis.

uniq er ideell for de som foretrekker spesialiserte verktøy som utfører en bestemt oppgave godt. Den egner seg spesielt godt til bruk i kombinasjon med andre kommandoer via pipes. En av dens hyppigste samarbeidspartnere er sort, siden uniq krever sortert input for å fungere korrekt.

La oss sette i gang!

Kjøring av uniq uten tilleggsvalg

Vi har en tekstfil som inneholder teksten til Robert Johnsons sang «I believe I’ll dust my broom». La oss undersøke hva som er unikt ved den.

Vi skriver inn følgende for å sende resultatet til less:

uniq dust-my-broom.txt | less

Vi ser hele sangen, inkludert gjentatte linjer, i less.

Det ser ikke ut til å være hverken de unike eller de gjentatte linjene.

Det er riktig – dette er den første innledende tilnærmingen. Når du kjører uniq uten tilleggsvalg, oppfører den seg som om du har brukt alternativet -u (unike linjer). Dette instruerer uniq om å skrive ut kun de unike linjene i filen. Grunnen til at du ser gjentatte linjer, er at for at uniq skal anse en linje som en duplikat, må den være ved siden av duplikatet, og det er her sort kommer inn.

Når vi sorterer filen, grupperes de gjentatte linjene, og uniq behandler dem som duplikater. Vi bruker sort på filen, videresender det sorterte resultatet til uniq, og deretter sender vi det endelige resultatet til less.

For å gjøre dette skriver vi følgende:

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

En sortert liste over unike linjer vises i less.

Linjen, «I believe I’ll dust my broom,» forekommer definitivt mer enn én gang i sangen. Faktisk gjentas den to ganger i de første fire linjene.

Så hvorfor vises den i en liste over unike linjer? Fordi første gang en linje vises i filen, er den unik; bare de påfølgende forekomstene er duplikater. Du kan tenke på det som en liste over den første forekomsten av hver unike linje.

La oss bruke sort igjen og sende utdataene til en ny fil. På denne måten trenger vi ikke bruke sortering i hver kommando.

Vi skriver inn følgende kommando:

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

Nå har vi en forhåndssortert fil å jobbe med.

Telle duplikater

Du kan bruke alternativet -c (telling) for å skrive ut hvor mange ganger hver linje vises i en fil.

Skriv inn følgende kommando:

uniq -c sorted.txt | less

Hver linje begynner med antallet ganger den linjen vises i filen. Du vil imidlertid legge merke til at den første linjen er tom. Dette forteller deg at det er fem tomme linjer i filen.

Hvis du vil at utdataene skal sorteres i numerisk rekkefølge, kan du sende utdataene fra uniq til sort. I vårt eksempel bruker vi alternativene -r (omvendt) og -n (numerisk sortering), og sender resultatene til less.

Vi skriver følgende:

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

Listen er sortert i synkende rekkefølge basert på frekvensen av hver linjes forekomst.

Lister kun dupliserte linjer

Hvis du bare vil se linjene som er gjentatt i en fil, kan du bruke alternativet -d (dupliserte). Uansett hvor mange ganger en linje er duplisert i en fil, vises den bare én gang.

For å bruke dette alternativet skriver vi følgende:

uniq -d sorted.txt

De dupliserte linjene er oppført for oss. Du vil legge merke til den tomme linjen øverst, noe som betyr at filen inneholder dupliserte tomme linjer – det er ikke noe mellomrom igjen av uniq for å forskyve oppføringen visuelt.

Vi kan også kombinere alternativene -d (dupliserte) og -c (telle) og sende utdataene gjennom sort. Dette gir oss en sortert liste over linjene som vises minst to ganger.

Skriv inn følgende for å bruke dette alternativet:

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

Liste over alle dupliserte linjer

Hvis du vil se en liste over hver dupliserte linje, samt en oppføring for hver gang en linje vises i filen, kan du bruke alternativet -D (alle dupliserte linjer).

For å bruke dette alternativet, skriver du følgende:

uniq -D sorted.txt | less

Oppføringen inneholder en oppføring for hver dupliserte linje.

Hvis du bruker --group-alternativet, skrives hver dupliserte linje ut med en tom linje enten før (prepend) eller etter hver gruppe (append), eller både før og etter (both) hver gruppe.

Vi bruker append som modifikator, så vi skriver inn følgende:

uniq --group=append sorted.txt | less

Gruppene er atskilt med tomme linjer for å gjøre dem lettere å lese.

Kontrollere et visst antall tegn

Som standard sjekker uniq hele lengden på hver linje. Hvis du vil begrense sjekkene til et visst antall tegn, kan du imidlertid bruke alternativet -w (sjekk tegn).

I dette eksemplet gjentar vi den siste kommandoen, men begrenser sammenligningene til de tre første tegnene. For å gjøre det skriver vi følgende kommando:

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

Resultatene og grupperingene vi får er ganske forskjellige.

Alle linjer som starter med «I b» er gruppert sammen fordi disse delene av linjene er like, så de anses å være duplikater.

På samme måte behandles alle linjer som starter med «jeg» som duplikater, selv om resten av teksten er forskjellig.

Ignorere et visst antall tegn

Det finnes situasjoner der det kan være fordelaktig å hoppe over et visst antall tegn i starten av hver linje, for eksempel når linjene i en fil er nummerert. Eller si at du trenger uniq for å hoppe over et tidsstempel og begynne å sjekke linjene fra tegn seks i stedet for fra det første tegnet.

Nedenfor ser du en versjon av vår sorterte fil med nummererte linjer.

Hvis vi vil at uniq skal starte sine sammenligningssjekker ved tegn tre, kan vi bruke alternativet -s (hopp over tegn) ved å skrive følgende:

uniq -s 3 -d -c numbered.txt

Linjene oppdages som duplikater og telles riktig. Merk at linjenumrene som vises, er for den første forekomsten av hvert duplikat.

Du kan også hoppe over felt (en serie tegn og et mellomrom) i stedet for tegn. Vi bruker alternativet -f (felt) for å fortelle uniq hvilke felt som skal ignoreres.

Vi skriver følgende for å fortelle uniq å ignorere det første feltet:

uniq -f 1 -d -c  numbered.txt

Vi får de samme resultatene som da vi ba uniq hoppe over tre tegn i begynnelsen av hver linje.

Ignorerer forskjeller i store og små bokstaver

Som standard skiller uniq mellom store og små bokstaver. Hvis den samme bokstaven vises med stor og liten bokstav, anser uniq linjene som forskjellige.

Sjekk for eksempel utdataene fra følgende kommando:

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

Linjene «I Believe I’ll dust my broom» og «I believe I’ll dust my broom» behandles ikke som duplikater på grunn av forskjellen i stor og liten bokstav i «B» i «believe».

Hvis vi inkluderer alternativet -i (ignorer store og små bokstaver), vil disse linjene imidlertid bli behandlet som duplikater. Vi skriver følgende:

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

Linjene behandles nå som duplikater og grupperes sammen.

Linux gir deg en rekke spesialverktøy. Som mange av dem, er ikke uniq et verktøy du vil bruke hver dag.

Derfor er en viktig del av det å bli dyktig i Linux å huske hvilket verktøy som vil løse ditt nåværende problem, og hvor du kan finne det igjen. Men hvis du øver, er du på god vei.

Eller du kan alltids bare søke på How-To Geek – vi har sannsynligvis en artikkel om det.