2013-06-01 7 views
10

Ich habe etwa 350 Textdateien (und jede Datei ist etwa 75 MB). Ich versuche, alle Dateien zu kombinieren und doppelte Einträge zu entfernen. Die Datei ist in folgendem Format:mehrere Textdateien kombinieren und Duplikate entfernen

ip1,dns1 
ip2,dns2 
... 

ich einen kleinen Shell-Skript schrieb diese

#!/bin/bash 
for file in data/* 
do 
    cat "$file" >> dnsFull 
done 
sort dnsFull > dnsSorted 
uniq dnsSorted dnsOut 
rm dnsFull dnsSorted 

zu tun oft ich mache diese Verarbeitung und frag dich, ob es etwas gibt, was ich tun konnte zu verbessern die Verarbeitung beim nächsten Mal wenn ich es ausführe. Ich bin offen für jede Programmiersprache und Vorschläge. Vielen Dank!

+0

Sie könnten auch sortieren -ma versuchen -> es wird die einzelnen Dateien sortieren und sie entsprechend zusammenführen, daher sollte eine Menge Zeit sparen .... die Option -m war espl für Szenario wie folgt ... dh Sortieren -m Datei * | uniq -u – nsd

Antwort

30

Als Erstes verwenden Sie nicht die volle Leistung von cat. Die Schleife kann nur durch

ersetzt werden, vorausgesetzt, dass die Datei anfänglich leer ist.

Dann gibt es all diese temporären Dateien, die Programme zwingen, auf Festplatten zu warten (normalerweise die langsamsten Teile in modernen Computersystemen). Verwenden Sie eine Pipeline:

cat data/* | sort | uniq > dnsOut 

Dies allein da sort noch verschwenderisch ist, kann das tun, was Sie verwenden cat und uniq für; das ganze Skript kann durch

sort -u data/* > dnsOut 

ersetzt werden, wenn dies noch nicht schnell genug ist, dann erkennen, dass Sortierung nimmt O (n lg n) Zeit, während der Deduplizierung in linearer Zeit mit Awk getan werden kann:

awk '{if (!a[$0]++) print}' data/* > dnsOut 
+0

Sehr gut gesagt, danke. – drk

+5

Beachten Sie, dass das endgültige awk zu "awk" vereinfacht werden kann! A [$ 0] ++ 'data/* ' –

+1

Ich löschte meine Perl-Antwort, weil 350 * 75MB = mehr als 26GB - In-Memory-Sortierung (wie awk) verursachen kann zu viel Speicherwechsel. – jm666

Verwandte Themen