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}'