|
Unix-kommandon för kolumner, sortering och frekvensIntroduktionMå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:
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 kolumner1. Plocka ut kolumnerFö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 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
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 Och den andra
innehåller:
en gång Så skulle
paste
på
dessa filer ge den nya filen: Det
var
en gång 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. 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 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 |