CLI AI

Eine CSV-Spalte mit awk ausgeben (und wann nicht)

2026-05-06

awk -F, '{print $2}' file.csv holt eine Spalte in einer Zeile heraus, und bei maschinell erzeugtem CSV ist die Geschichte damit zu Ende. Bei CSV aus einer Tabellenkalkulation gibt es eine Falle, die statt eines Fehlers falsche Zahlen liefert — daher lohnt es sich zu wissen, wo die Grenze liegt.

1. Eine Spalte

clai
$ clai gib die erste Spalte von data.csv aus→ awk -F, '{print $1}' data.csvnameAliceBob

-F, legt das Feldtrennzeichen fest. Felder sind $1, $2, … und $0 ist die ganze Zeile.

2. Mehrere Spalten, ohne Kopfzeile

clai
$ clai gib die Spalten 1 und 3 aus data.csv ohne die Kopfzeile aus→ awk -F, 'NR>1 {print $1, $3}' data.csvAlice 100Bob 250

NR>1 überspringt die erste Zeile. NR ist die Datensatznummer, und sie als Bedingung zu nutzen ist awks Art, „für die Zeilen, wo…“ auszudrücken.

3. Beim Ausgeben durch Kommas getrennt lassen

clai
$ clai extrahiere die Spalten 1 und 3 als gültiges csv→ awk -F, 'BEGIN{OFS=","} NR>1 {print $1,$3}' data.csvAlice,100Bob,250

print $1, $3 verbindet die Felder mit OFS, das standardmäßig ein Leerzeichen ist. Setze es in BEGIN, und die Ausgabe ist wieder CSV.

4. Eine Spalte summieren

clai
$ clai summiere die dritte Spalte von data.csv→ awk -F, 'NR>1 {s+=$3} END {print "total", s}' data.csvtotal 350

Keine Variablendeklaration, keine Initialisierung — in awk starten Zahlen bei null. END läuft einmal, nach der letzten Zeile.

5. Zeilen filtern und dann eine Spalte nehmen

clai
$ clai zeig die Namen, bei denen der Betrag über 200 liegt→ awk -F, 'NR>1 && $3 > 200 {print $1}' data.csvBob

Hier schlägt awk eine Tabellenkalkulation: derselbe One-Liner läuft über eine 3-GB-Datei, ohne sie zu öffnen.

6. Die Falle: ein Komma in einem Feld mit Anführungszeichen

clai
$ clai gib die zweite Spalte aus→ awk -F, 'NR>1 {print $2}' data.csvBerlin"Paris

Die Zeile Bob,"Paris, France",250 hat drei logische Felder, aber vier Kommas. Awk weiß nichts von Anführungszeichen, also wird $2 zu "Paris, $3 zu France", und die Summe aus Schritt 4 liefert stillschweigend 100 statt 350. Es gibt keinen Fehler — nur die falsche Zahl.

Fallstricke

  • Prüfe auf Anführungszeichen, bevor du einer Summe traust. grep -c '"' file.csv — ist das null, ist einfaches awk sicher. Wenn nicht, nimm einen echten CSV-Parser: csvcut -c 1,3 data.csv (csvkit), mlr --csv cut -f name,amount (Miller) oder drei Zeilen Python.
  • -F, ist nicht dasselbe wie -F', '. Ein Trennzeichen aus Komma-plus-Leerzeichen erzeugt stillschweigend leere Felder in Zeilen ohne dieses Leerzeichen.
  • Windows-Zeilenumbrüche lassen ein \r im letzten Feld zurück. $NF stimmt dann ohne ersichtlichen Grund nicht überein. Behebbar mit awk -F, '{gsub(/\r$/,"")} …' oder indem man vorher dos2unix laufen lässt.

Verwandte Fragen

Wie gebe ich die letzte Spalte aus? awk -F, '{print $NF}'. NF ist die Anzahl der Felder, also ist $NF die letzte und $(NF-1) die davor.

Wie benutze ich Tab als Trennzeichen? awk -F'\t' — in Anführungszeichen, damit die Shell den Backslash nicht verschluckt.

Ist awk schneller als pandas dafür? Zum Extrahieren oder Summieren einer Spalte aus einer großen Datei — ja, deutlich: es arbeitet im Stream und baut nie eine Datenstruktur auf. Für Joins oder Umformen nimm pandas.

Siehe auch

Beschreibe die Extraktion, die du willst; CliAI schreibt das awk-Programm, inklusive des BEGIN{OFS=","}, das du vergessen würdest. In einer Zeile installieren.