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 ( {} ).



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow