GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von awk zum Summieren der Werte einer Spalte basierend auf den Werten einer anderen Spalte

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

Linux
  1. Wie kann man mit einem anderen Server per SSH auf einen Server zugreifen?

  2. Verwendung von –exclude mit dem Du-Befehl?

  3. grep, um Daten in der ersten Spalte zu suchen

  4. Verschieben Sie eine Linux-Installation mit btrfs auf dem Standard-Subvolume (subvolid=0) auf ein anderes Subvolume

  5. Verwenden von grep vs. awk

Verwenden des kostenlosen Linux-Befehls

Verwenden der SSH-Konfigurationsdatei

Tutorial zur Verwendung des Timeout-Befehls unter Linux

Linux – Einer CSV-Datei eine Spalte hinzufügen, die eine Summe der beiden vorherigen Spalten ist?

Noch ein weiterer Sudoku-Puzzle-Löser mit AWK

Wie ersetze ich den Inhalt einer bestimmten Spalte durch awk?