kombinieren Sie mehrere text-Dateien und entfernen Sie Duplikate
Habe ich rund 350 text-Dateien (jede Datei ist rund 75 MB). Ich versuche zu kombinieren, Sie alle Dateien und entfernen Sie doppelte Einträge. Die Datei wird im folgenden format ein:
ip1,dns1
ip2,dns2
...
Schrieb ich ein kleines shell-Skript dazu
#!/bin/bash
for file in data/*
do
cat "$file" >> dnsFull
done
sort dnsFull > dnsSorted
uniq dnsSorted dnsOut
rm dnsFull dnsSorted
Ich mache diese Verarbeitung oft und Frage mich, ob es irgendetwas gibt, das ich tun könnte, um zu verbessern, die Verarbeitung das nächste mal, wenn ich ihn laufen. Ich bin offen für jede Programmiersprache und Anregungen. Danke!
Sie könnten auch geben Art -m a versuchen --> es wird die Sortierung der einzelnen Dateien, und führen Sie Sie entsprechend daher sollte sparen einiges an Zeit .... der -m-option verfügbar war, VK für Szenario wie dieses ... ie Art -m-Datei* | uniq -u
InformationsquelleAutor drk | 2013-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off, Sie sind nicht mit der vollen Leistung von
cat
. Die Schleife kann ersetzt werden durch nurvorausgesetzt, die Datei ist anfangs leer.
Dann gibt es all diejenigen, die temporären Dateien, die Kraft, die Programme zu warten, bis Festplatten (meist die langsamsten Teile in modernen computer-Systeme). Verwendung einer Rohrleitung:
Dies ist immer noch verschwenderisch, da
sort
allein tun können, was Sie verwendencat
unduniq
; das ganze Skript kann ersetzt werden durchWenn dies immer noch nicht schnell genug ist, dann erkennen Sie, dass das Sortieren in O(n lg n) Zeit, während der Deduplizierung kann man in linearer Zeit mit Awk:
Beachten Sie, daß der awk vereinfacht werden können, um
awk '!a[$0]++' data/*
Ich löschte meine perl Antwort, denn 350 * 75 MB = mehr als 26GB - in-memory-Sortierung (wie awk) kann dazu führen, zu viel Speicher austauschen.
Sorry, was bedeutet awk '!a[$0]++'? Tut es vergleichen, um das erste element, oder die ganze Zeile?
InformationsquelleAutor Fred Foo