Ich verwende viel grep awk-Sortierung in meiner Unix-Shell, um mit mittelgroßen (ca. 10 bis 100 Millionen Zeilen) tabulatorgetrennten Spaltentextdateien zu arbeiten. In dieser Hinsicht ist die Unix-Shell meine Tabelle.
Aber ich habe ein großes Problem, nämlich die Auswahl von Datensätzen mit einer Liste von IDs.
Wenn Sie eine table.csv
Datei mit Format id\tfoo\tbar...
und eine ids.csv
Datei mit einer Liste von IDs haben, wählen Sie nur Datensätze aus, in table.csv
denen eine ID vorhanden ist ids.csv
.
Art von /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids, aber mit Shell, nicht Perl.
grep -F
erzeugt offensichtlich falsch positive Ergebnisse, wenn die IDs eine variable Breite haben.
join
ist ein Dienstprogramm, das ich nie herausfinden konnte. Zuallererst erfordert es eine alphabetische Sortierung (meine Dateien sind normalerweise numerisch sortiert), aber selbst dann kann ich es nicht zum Laufen bringen, ohne mich über falsche Reihenfolge zu beschweren und einige Datensätze zu überspringen. Also ich mag es nicht. grep -f gegen Datei mit ^id\t
-s ist sehr langsam, wenn die Anzahl der IDs groß ist.
awk
ist umständlich.
Gibt es dafür gute Lösungen? Gibt es spezielle Tools für durch Tabulatoren getrennte Dateien? Zusätzliche Funktionen sind ebenfalls sehr willkommen.
UPD: Korrigiert sort
->join
awk
.
sort
kann alle Arten von Sortierungen, numerischen, alphabetischen und anderen durchführen. Siehe man sort
.
grep -f
es zu langsam ist, klingt die Beibehaltung dieser Strategie nach mehr Ärger als es wert ist - Variationen werden wahrscheinlich denselben O (N * M) -Leistungsproblemen zum Opfer fallen. Vielleicht ist es besser, wenn Sie lernen, wie man eine normalisierte SQL-