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 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 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 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 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 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 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
\rim letzten Feld zurück.$NFstimmt dann ohne ersichtlichen Grund nicht überein. Behebbar mitawk -F, '{gsub(/\r$/,"")} …'oder indem man vorherdos2unixlaufen 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
- Suchen und Ersetzen in allen Dateien eines Projekts
- Hunderte Dateien umbenennen: von
for-Schleifen zu normaler Sprache - Vom One-Liner zum eingecheckten Skript: wann der Wechsel sich lohnt
Beschreibe die Extraktion, die du willst; CliAI schreibt das awk-Programm, inklusive des BEGIN{OFS=","}, das du vergessen würdest. In einer Zeile installieren.