Unix-kommandon för kolumner, sortering och frekvens

Introduktion

Många filer har data ordnade i kolumner, även kallade fält. Oftast är kolumnerna åtskilda med ett tabulator-tecken (tab: \t), men andra separatorer förekommer: t.ex. kolon (:)  semikolon (;) eller bara ett blanktecken.

T.ex. är den utdata, som FDG genererar ordnad i fem kolumner åtskilda med tab-tecknet:

1

Synd

synd

main:>0

%NH N SG NOM

2

att

att

pm:>4

%CS CS

3

du

du

subj:>4

%NH PRON SG NOM

4

gav

ge

 

%MV V PAST

5

bort

bort

advl:>4

%AH ADV

6

dina

du

attr:>7

%>N PRON PL GEN

7

shorts

shorts

obj:>4

%NH N SG NOM

8

.

.

 

 

Det verkar vara blanka (I varierande antal) mellan fälten, men det ser bara så ut därför att den editor, ni visar filen i, tolkar varje tab och ”hoppar fram” till nästa tab-stopp.

Första raden ser egentligen ut så här:

 "1\tSynd\tsynd\tmain:>0\t%NH N SG NOM"

 med 4 '\t' mellan de fem fälten.

 

Kommandon för att hantera kolumner

1. Plocka ut kolumner

För att plocka ut bara vissa fält i en fil, kan kommandot  cut användas.

cut –f3 filnamn

Detta ger en ny fil, där endast kolumn nummer 3 finns med. Kör vi på ovanstående indata får vi:

synd
att
du
ge
bort
du
shorts
.

dvs varje rad innehåller bara det som stod i tredje kolumnen. Man kan ta ut hur många och vilka kolumner man önskar, men man kan inte ändra deras ordning. Räkna upp kolumnernas nummer med komma-tecken mellan:

cut  -f1,3,4 filnamn              

Det går också att använda intervall:

cut  -f1-3,4 filnamn

Det förra ger kolumn 1, 3 och 4. Det senare betyder kolumn 1,2,3 (1-3) och kolumn 4, vilket givetvis skulle kunna skrivas:

cut  -f1-4 filnamn

Observera att bindestrecket framför 'f' behövs för att göra '-f' till en flagga, medan bindestrecket mellan siffrorna är för att markera att vi vill ha alla kolumner i intervallet 1 till 4.

"Cut" använder tab-tecknet som kolumnskiljare om inget annat anges. För att ange att ett annat tecken ska användas för att skilja en kolumn från en annan kan använda flaggan -d (delimiter) efter -f. Om man t.ex. vill låta blanksteg åtskilja kolumner skriver man:

cut  -f2 -d ' ' filnamn

2. Lägga till kolumner

Man kan från två kolumnordnade filer, säg en med 3 kolumner, den andra med 2, skapa en ny fil, som innehåller alla 5 kolumnerna. Detta görs med kommandot:

paste  fil1  fil2

Exempelvis, om första filen har texten:

Det        var
en         häxa
ett        hus
godis      och
grädde

Och den andra innehåller:

en         gång
som        hade
gjort      av
sirap      med

Så skulle paste på dessa filer ge den nya filen:

Det        var        en         gång
en         häxa       som        hade
ett        hus        gjort      av
godis      och        sirap      med
grädde

3. Ändra ordning på kolumner

För att ändra två kolumners inbördes ordning, gör man enklast så att man:

   - Först använder cut (flera ggr) för att ”klippa” ut varje kolumn ensam i en egen fil,

- Sedan använder paste för att sätta ihop urklippta kolumner i önskad ordning

T.ex. byt plats på kolumn 1 och 2 (i en 4-kolumnig fil):

cut -f1 filnamn > kolumn1.txt

cut –f2 filnamn > kolumn2.txt

cut –f3-4 filnamn > kolumner3-4.txt

paste  kolumn2.txt  kolumn1.txt  kolumner3-4.txt  >  nyOrdnad

Ordningen på argumenten till paste är viktig. Det är det, som gör att man får annan ordning på kolumnerna i utdatafilen nyOrdnad.

4. Kommando för att sortera raderna i en fil

Med kommandot sort, via olika flaggor, kan man sortera raderna i en fil i vilken ordning man vill:

sort < fil -- i teckenordning (alla tecken på raden räknas)

sort -d < fil -- i bokstavsordning (bara bokst, siffror, blank räknas)

sort -n < fil -- i nummerordning (första fält måste vara tal)

sort -f < fil -- alfabetiskt utan skillnad på stora och små bokst.

Alla dessa sorteringssätt har en "naturlig" ordning: i bokstavsordning innebär att ord på 'a' kommer först, nummerordning är stigande, dvs små tal först. Man kan dock "kasta om" varje sorteringsording, så att man får det i bakvänd ordning. Detta görs genom att också ge flaggan '-r':

sort -r -d < fil -- sortera i bokstavsordning baklänges

sort -r -n < fil -- sortera i fallande nummerordning

Man kan t.o.m. sortera ihop ("merge") två filer till en. Förutsättningen är förstås att de två filerna var för sig redan är sorterade (och på samma sätt). Detta görs med

sort -d -m fil1 fil2 -- sorterar ihop alfabetiskt ordnade filer

sort -n -m fil1 fil2 -- sorterar ihop filer sorterade i nummerordning

5. Kommandon som tar bort (eller räknar) duplicerade rader

För att kunna göra något med de rader, som är upprepade i en fil, krävs (i UNIX) att raderna ligger direkt efter varandra. Detta åstadkoms dock enkelt genom att man sorterar dem först.

sort < infil > sorterad-fil

En sorterade fil förutsätts därför i det följande.

1. Ta bort upprepade rader i en fil

Med kommandot uniq kan man enkelt ta bort alla rader, som upprepas i en fil:

uniq < sorterad-fil > fil-utan-upprepade-rader

2. Räkna frekvens, dvs duplicerade rader

Vill man räkna hur många gånger en viss rad förekommer, sorterar man först. Därefter ger man flaggan '-c' till uniq

uniq -c < sorterad-fil > fil-med-frekvens