awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
- Der
-F
Flag setzt den Feldtrenner; Ich habe es in einfache Anführungszeichen gesetzt, weil es ein spezielles Shell-Zeichen ist. - Dann
$1 ~ /smiths/
wendet den folgenden {Codeblock} nur auf Zeilen an, in denen das erste Feld mit dem Regex/smiths/
übereinstimmt . - Der Rest ist derselbe wie Ihr Code.
Beachten Sie, dass Sie, da Sie hier nicht wirklich einen regulären Ausdruck verwenden, sondern nur einen bestimmten Wert, genauso einfach verwenden könnten:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Was die Gleichheit der Zeichenfolge überprüft. Dies entspricht der Verwendung des Regex /^smiths$/
, wie in einer anderen Antwort erwähnt, die den ^
enthält Anker so, dass er nur mit dem Anfang der Zeichenfolge (dem Anfang von Feld 1) und dem $
übereinstimmt Anker so, dass er nur mit dem Ende der Zeichenfolge übereinstimmt. Ich bin mir nicht sicher, wie vertraut Sie mit Regexes sind. Sie sind sehr leistungsfähig, aber für diesen Fall könnten Sie genauso einfach eine String-Gleichheitsprüfung verwenden.
Ein anderer Ansatz ist die Verwendung von awk assoziativen Arrays, mehr Infos hier. Diese Zeile erzeugt die gewünschte Ausgabe:
awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt
Als Nebeneffekt speichert das Array alle anderen Werte:
awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt
Ausgabe:
smiths 212
denniss 100
olivert 10
Sehr gut bisher. Alles, was Sie tun müssen, ist, einen Selektor vor dem Block hinzuzufügen, um die Summe zu addieren. Hier prüfen wir, ob das erste Argument nur „smiths“ enthält:
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
Sie könnten dies etwas verkürzen, indem Sie das Feldtrennzeichen als Option angeben. In awk
Es ist im Allgemeinen eine gute Idee, Variablen auf der Befehlszeile zu initialisieren:
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'