awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
- Das
-F
Flag setzt das Feldtrennzeichen. Ich habe es in einfache Anführungszeichen gesetzt, weil es ein spezielles Shell-Zeichen ist.
- Dann
$1 ~ /smiths/
gilt den folgenden {Codeblock} nur auf Strecken , auf denen das erste Feld die Regex übereinstimmt /smiths/
.
- Der Rest ist derselbe wie Ihr Code.
Beachten Sie, dass Sie, da Sie hier nicht wirklich einen regulären Ausdruck verwenden, nur einen bestimmten Wert, genauso einfach verwenden können:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Damit wird die Gleichheit der Zeichenfolgen überprüft. Dies entspricht der Verwendung des regulären Ausdrucks /^smiths$/
, wie in einer anderen Antwort erwähnt, bei der der ^
Anker nur mit dem Anfang der Zeichenfolge (dem Anfang von Feld 1) und der $
Anker nur mit dem Ende der Zeichenfolge übereinstimmen. Ich bin mir nicht sicher, wie gut Sie mit Regexen vertraut sind. Sie sind sehr leistungsfähig, aber in diesem Fall können Sie genauso einfach eine String-Gleichheitsprüfung durchführen.
unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
Ein anderer Ansatz ist die Verwendung von awk-assoziativen Arrays. Weitere Informationen finden Sie hier . Diese Zeile erzeugt die gewünschte Ausgabe:
Als Nebeneffekt speichert das Array alle anderen Werte:
Ausgabe:
quelle
Bisher sehr gut Sie müssen lediglich einen Selektor vor dem Block hinzufügen, um die Summe zu addieren. Hier überprüfen wir, dass das erste Argument nur "Schmiede" enthält:
Sie können dies ein wenig verkürzen, indem Sie das Feldtrennzeichen als Option angeben. Im
awk
Allgemeinen ist es eine gute Idee, Variablen in der Befehlszeile zu initialisieren:quelle
-F
Option zur Angabe des Trennzeichens.$NF
steht für "letzte Spalte".quelle
cat
undgrep
sind hier unnötig./smiths/{...}
wenn der grep-Aufruf nicht vorhanden ist. Dies ist eine geringfügige Änderung, bietet jedoch erhebliche Vorteile: Die Anzahl der ausgeführten Prozesse wird verringert, die Fehlerkontrolle vereinfacht und der Code wird klarer.Ich persönlich würde es vorziehen, den
awk
Abschnitt so einfach wie möglich zu halten und so viel wie möglich ohne ihn zu tun. Die kombinierte Logik nutzt die Leistung von Unix-Pipelines nicht aus und ist daher für eng verwandte Anwendungsfälle schwerer zu verstehen, zu debuggen oder zu modifizieren.quelle