Ich arbeite auf einem Mac mit sed, perl, awk, bash ..
Ich habe eine große Textdatei (10 GB) mit 13 Feldern (Spalten) mit TAB
begrenzten Daten. Leider sind einige dieser Zeilen irrelevant TABs
, daher möchte ich die gesamte Zeile löschen, in der wir zusätzliche TABs
und damit ungleiche Felder haben. (Es macht mir nichts aus, die Zeilen in ihrer Gesamtheit zu verwerfen)
Was ich derzeit habe, schreibt die Anzahl der Felder in eine andere Datei.
awk -F'\t' '{print NF}' infile > fieldCount
head fieldCount
13
13
10
13
13
13
14
13
13
13
Ich möchte ein kurzes Skript erstellen, das jede Zeile mit mehr (oder weniger) als 13 richtigen Feldern (aus der Originaldatei) entfernt.
- Geschwindigkeit ist hilfreich, da ich dies für mehrere Dateien tun muss
- es auf einmal zu machen wäre cool
- Ich portiere derzeit die fieldCount-Datei in Python und versuche, sie zeilenweise zu laden.
BEARBEITEN:
vaild (13 Spalten)
a b c d e f g h i j k l m
ungültig (14 Spalten)
a b c d e f g h i j k l m n
text-processing
sed
awk
columns
T. Scharf
quelle
quelle
Antworten:
Sie haben es fast schon:
Und wenn Sie sich auf einem dieser Systeme befinden, auf denen Sie per Tastendruck (:)) belastet werden, können Sie dies auf verkürzen
Um mehrere Dateien in einem Durchlauf auszuführen und die Dateien tatsächlich zu ändern (und nicht nur neue Dateien zu erstellen), identifizieren Sie einen Dateinamen, der nicht verwendet wird (z. B.
scharf
), und führen Sie eine Schleife wie die folgende aus:Dies
list
können ein oder mehrere Dateinamen und / oder Platzhalter-Dateinamen-Erweiterungsmuster sein. zum Beispiel,Der
mv
Befehl überschreibt die Eingabedatei (z. B.blue.data
) mit der temporärenscharf
Datei (die nur die Zeilen aus der Eingabedatei mit 13 Feldern enthält). (Stellen Sie sicher, dass Sie dies tun möchten, und seien Sie vorsichtig. Um sicher zu gehen, sollten Sie Ihre Daten wahrscheinlich zuerst sichern.) Der-f
Befehlmv
zum Überschreiben der Eingabedatei, obwohl diese bereits vorhanden ist. Das--
schützt Sie vor Verrücktheit, wenn eine Ihrer Dateien einen Namen hat, der mit beginnt-
.quelle
Da es sich um eine große Datei handelt, kann es sich lohnen, ein etwas komplexeres Tool zu verwenden, um die Leistung zu steigern. In der Regel sind Spezialwerkzeuge schneller als allgemeine Werkzeuge. Zum Beispiel ist das Lösen des gleichen Problems mit
cut
tendenziell schneller als das,grep
was tendenziell schneller ist als das,sed
was tendenziell schneller ist alsawk
(die Kehrseite ist, dass spätere Werkzeuge Dinge tun können, die frühere nicht können).Sie möchten Zeilen mit 13 oder mehr Tabulatorzeichen entfernen, also:
oder vielleicht (ich erwarte keinen messbaren Leistungsunterschied)
Wo
␉
ist ein wörtliches Tabulatorzeichen? Das Festlegen des Gebietsschemas aufC
ist nicht erforderlich, beschleunigt jedoch einige Versionen von GNU grep im Vergleich zu Multibyte-Gebietsschemas.quelle
Mit
perl
:Fügen Sie zum Bearbeiten an Ort und Stelle die
-i
Option hinzu:quelle