Ricerca…


Elaborazione di dati tabulari affidabili (CSV et al.)

L'elaborazione di dati tabulari con awk è molto semplice, a condizione che l'input sia formattato correttamente. La maggior parte del software che produce dati tabulari utilizza caratteristiche specifiche di questa famiglia di formati e i programmi di elaborazione dei dati di awk sono spesso specifici per i dati prodotti da un software specifico. Se è necessaria una soluzione più generica o robusta, la maggior parte delle lingue più diffuse fornisce librerie che si adattano a molte funzionalità presenti nei dati tabulari:

  • nomi di colonne opzionali sulla prima riga
  • miscela di valori di colonna quotati e non quotati
  • vari delimitatori
  • formati localizzati per numeri mobili

Mentre è sicuramente possibile gestire tutte queste funzionalità in modo pulito e generico con awk, questo probabilmente non vale la pena.

Scambio di due colonne in dati tabulari

Dato un file usando ; come delimitatore di colonna. Permutare la prima e la seconda colonna è realizzato da

awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'

Calcola la media dei valori in una colonna dai dati tabulari

Dato un file usando ; come delimitatore di colonna. Calcoliamo la media dei valori nella seconda colonna con il seguente programma, l'input fornito è l'elenco dei voti di un gruppo di studenti:

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

L'output di questo programma è 2.125 .

Ricordare che NR contiene il numero della riga in elaborazione, nel blocco END quindi mantiene il numero totale di righe nel file.

Ricorda che in molte applicazioni (monitoraggio, statistiche) , la mediana è un'informazione molto più utile. Guarda l'esempio corrispondente.

Selezione di colonne specifiche in dati tabulari

Assumiamo un file usando; come delimitatore di colonna. La selezione di una serie specifica di colonne richiede solo un'istruzione di stampa . Ad esempio, il seguente programma seleziona le colonne 3, 4 e 7 dal suo input:

awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'

È come al solito possibile scegliere più attentamente le linee da stampare. Il seguente programma seleziona le colonne 3, 4 e 7 dal suo input quando il primo campo è Alice o Bob :

awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'

Calcola la mediana dei valori in una colonna dai dati tabulari

Dato un file usando ; come delimitatore di colonna. Calcoliamo la mediana dei valori nella seconda colonna con il seguente programma, scritto per GNU awk . L'input fornito è l'elenco dei voti di un gruppo di studenti:

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

L'output di questo programma è 1 .

Ricordare che NR contiene il numero della riga in elaborazione, nel blocco END quindi mantiene il numero totale di righe nel file.

Molte implementazioni di awk non hanno una funzione per ordinare le matrici, che quindi devono essere definite prima che il codice sopra possa essere usato.

Selezione di un insieme di linee tra due motivi

La combinazione di pattern può essere utilizzata efficacemente con awk poiché controlla le azioni che la seguono, ovvero { pattern } { action } . Un uso interessante della corrispondenza del modello consiste nel selezionare più elementi tra due motivi in ​​un file come patternA e patternB

$ awk '/patternA/,/patternB/' file

Supponiamo che il mio contenuto del file sia il seguente, e voglio estrarre le linee solo tra il modello sopra:

$ 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

Il comando precedente non esegue alcuna { action } specifica oltre a stampare le righe corrispondenti, ma qualsiasi azione specifica all'interno del sottoinsieme di righe può essere applicata con un blocco di azioni ( {} ).



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow