awk
Användbara linjer - beräknar medelvärde från en CSV osv
Sök…
Robust bearbetning av tabelluppgifter (CSV et al.)
Att bearbeta tabelldata med awk är mycket enkelt, förutsatt att ingången är korrekt formaterad. De flesta programvaror som producerar tabelldata använder specifika funktioner i denna familj av format, och awk- program som bearbetar tabelldata är ofta specifika för en data som produceras av en specifik programvara. Om en mer generisk eller robust lösning krävs, tillhandahåller de flesta populära språk bibliotek med många funktioner som finns i tabelldata:
- valfria kolumnnamn på den första raden
- blandning av citerade och icke citerade kolumnvärden
- olika avgränsare
- lokaliserade format för flytande nummer
Det är definitivt möjligt att hantera alla dessa funktioner rent och generiskt med awk, men det är förmodligen inte värt ansträngningen.
Utbyta två kolumner i tabelldata
Gett en fil med ; som en kolumnavgränsare. Permutering av den första och den andra kolumnen uppnås av
awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'
Beräkna medelvärdet i en kolumn från tabelldata
Gett en fil med ; som en kolumnavgränsare. Vi beräknar medelvärdet av värdena i den andra kolumnen med följande program, den medföljande inmatningen är listan över betyg i en studentgrupp:
awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Utgången från detta program är 2.125 .
Kom ihåg att NR har antalet linjer som behandlas, i END blocket har det därför det totala antalet rader i filen.
Kom ihåg att medianen i många applikationer (övervakning, statistik) är en mycket mer användbar information. Se motsvarande exempel.
Välja specifika kolumner i tabelldata
Vi antar en fil med; som en kolumnavgränsare. Att välja en specifik kolumnuppsättning kräver endast en utskrift . Till exempel väljer följande program kolumnerna 3, 4 och 7 från dess ingång:
awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'
Det är som vanligt möjligt att noggrant välja rader som ska skrivas ut. Följande program väljer kolumnerna 3, 4 och 7 från dess ingång när det första fältet är Alice eller Bob :
awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'
Beräkna värdet median i en kolumn från tabelldata
Gett en fil med ; som en kolumnavgränsare. Vi beräknar medianen för värdena i den andra kolumnen med följande program, skriven för GNU awk . Den angivna inmatningen är listan över betyg i en studentgrupp:
gawk -F';' '{ sample[NR] = $2 }
END {
asort(sample);
if(NR % 2 == 1) {
print(sample[int(NR/2) + 1])
} else {
print(sample[NR/2])
}
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Utgången från detta program är 1 .
Kom ihåg att NR har antalet linjer som behandlas, i END blocket har det därför det totala antalet rader i filen.
Många implementationer av awk har inte en funktion för att sortera matriser, som därför måste definieras innan koden ovan skulle kunna användas.
Välja en uppsättning rader mellan två mönster
Mönstermatchning kan användas effektivt med awk eftersom det styr de åtgärder som följer det, dvs { pattern } { action } . En cool användning av mönstermatchningen är att välja flera mellan två mönster i en fil, säger patternA och patternB
$ awk '/patternA/,/patternB/' file
Antag att mitt filinnehåll är som följer, och jag vill bara extrahera raderna mellan ovanstående mönster: -
$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6
$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
Ovanstående kommando gör inte någon specifik { action } annat än att skriva ut de matchande raderna, men alla specifika åtgärder inom delmängden av rader kan tillämpas med ett åtgärdsblock ( {} ).