Awk überspringen CSV Zeilen mit dem zweiten Feld leer
Ich habe eine 16GB CSV, die ;-getrennt und die Felder sind immer anzugeben. Ich muss schnell herausfiltern von Zeilen, in denen das zweite Feld ist leer.
"12345";"987";"..." # keep it
"67890";"";"..." # omit it
Die ersten beiden Felder sind nur zahlen, wenn diese Dinge für die Leistung.
Ich vermute, dass awk die wohl leistungsstärkste Werkzeug für dies, aber ich kann nicht scheinen, um es richtig zu machen. Ich habe versucht, aber es unterlässt die meisten Linien, die zu Unrecht:
cat huge.csv | awk '/^"\d+";"\d/' > filtered.csv
Natürlich muss es nicht sein, awk; eine Befehlszeile Werkzeug, die man üblicherweise auf linux und OS X tun wird.
- Die
cat
ist nicht wirklich nötig, dies wäre gleichbedeutend:awk '/^"\d+";"\d/' huge.csv > filtered.csv
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Lösung einfach mit
d.h., dein Befehl wäre:
Diese setzt das Eingabefeld separator
"
und prüft das 4. Feld. Wenn es nicht null ist druckt er die Linie implizit. Gibt:getestet mit GNU awk 3.1.6
\"
), obwohl)Wenn Sie wissen, dass
;
erscheint niemals in den angegebenen Bereich verwenden, können Sie awk für diese. Wenn dieses Kriterium erfüllt ist, jedoch können Sie tun:Vielleicht ist es ein bisschen sauberer zu schreiben so:
FPAT
variable FPAT=\"[^"]*\", aber das wird nicht helfen gegen zitiert Zitate\"
Versuchen Sie dies:
awk -v 'FS=;' '$2 != "\"\""' huge.csv > filtered.csv
Erklärung:
awk splittet Dateien in Datensätze(Standard: getrennt durch newline-Zeichen), und Datensätze werden aufgeteilt in Datensätze(Standard: durch whitespaces).
-v
option ermöglicht es, jedes awk-variable vor der Ausführung des Skripts, undFS
variable ist das Besondere vordefiniert, die angibt, regex für Felder separator. Dann wird das Skript sieht nur auf den zweiten Bereich(die zweite csv-Feld), und wenn es nicht leer ist, es (implizit) druckt den gesamten Datensatz.PS: Auch wenn Ihr Skript ist nicht-idiomatisch, es ist fast richtig: der reguläre Ausdruck sollte sein:
/^"[^"]*";"\d/
, so entspricht eine Zeile beim ersten Feld nicht numerisch ist.PPS: Wenn Sie brauchen, um filter Linien von einem bestimmten regex verwenden, unix-Dienstprogramm
grep
:grep '^"[^"]*";"[0-9]' huge.csv > filtered.csv
-v
verwenden Sie einfach-F ';'