GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzo di awk per sommare i valori di una colonna, in base ai valori di un'altra colonna

awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • Il -F flag imposta il separatore di campo; L'ho messo tra virgolette singole perché è un carattere speciale della shell.
  • Quindi $1 ~ /smiths/ applica il seguente {code block} solo alle righe in cui il primo campo corrisponde all'espressione regolare /smiths/ .
  • Il resto è uguale al tuo codice.

Nota che dal momento che non stai realmente usando una regex qui, solo un valore specifico, potresti usare altrettanto facilmente:

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

Che controlla l'uguaglianza delle stringhe. Ciò equivale all'uso della regex /^smiths$/ , come menzionato in un'altra risposta, che include il ^ anchor in modo che corrisponda solo all'inizio della stringa (l'inizio del campo 1) e al $ anchor in modo che corrisponda solo alla fine della stringa. Non sono sicuro di quanto tu abbia familiarità con le espressioni regolari. Sono molto potenti, ma in questo caso potresti usare altrettanto facilmente un controllo di uguaglianza delle stringhe.


Un altro approccio consiste nell'usare gli array associativi awk, maggiori informazioni qui. Questa riga produce l'output desiderato:

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

Come effetto collaterale, l'array memorizza tutti gli altri valori:

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

Uscita:

smiths 212
denniss 100
olivert 10

Molto bene finora. Tutto quello che devi fare è aggiungere un selettore prima del blocco per aggiungere la somma. Qui controlliamo che il primo argomento contenga solo "smiths":

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

Potresti accorciarlo un po' specificando il separatore di campo come opzione. In awk è generalmente una buona idea inizializzare le variabili sulla riga di comando:

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

Linux
  1. usando awk con le condizioni del valore della colonna

  2. Tagliare i video in base all'ora di inizio e di fine usando ffmpeg

  3. grep per cercare i dati nella prima colonna

  4. Sposta un'installazione Linux utilizzando btrfs sul sottovolume predefinito (subvolid=0) in un altro sottovolume

  5. Filtra un file .CSV in base ai valori della quinta colonna di un file e stampa quei record in un nuovo file

Risolvere i problemi utilizzando il filesystem proc su Linux

Usando il comando gratuito di Linux

Utilizzo del file di configurazione SSH

Tutorial sull'uso del comando Timeout su Linux

Linux:aggiungi una colonna a un Csv che è una somma delle due colonne precedenti?

Ancora un altro risolutore di puzzle di Sudoku che utilizza AWK