2016-08-02 6 views
1

Ich habe 2 große Dateien.Finden Sie passende IDs in zwei großen Dateien

file1 hat 160 Millionen Zeilen mit diesem Format: id:email

file2 verfügt über 45 Millionen Zeilen mit diesem Format: id:hash

Das Problem ist, alle gleich id s zu finden und mit Ausnahme derjenigen, zu einer dritten Datei, mit dem Format: email:hash

Versucht etwas wie:

awk -F':' 'NR==FNR{a[$1]=$2;next} {print a[$1]":"$2}' test1.in test2.in > res.in 

Aber es ist nicht :(

Beispiel file1 arbeiten:

9305718:[email protected] 
59287478:[email protected] 

file2:

21367509:e90100b1b668142ad33e58c17a614696ec04474c 
9305718:d63fff1d21e1a04c066824dd2f83f3aeaa0edf6e 

Wunschergebnis:

[email protected]:d63fff1d21e1a04c066824dd2f83f3aeaa0edf6e 
+0

160m Datensätze werden wahrscheinlich nicht in den Speicher passen. Sind diese Dateien nach ID sortiert? Wenn dies der Fall ist, ist 'Join' ein besseres Werkzeug für diese Aufgabe. – karakfa

+0

Ja, es ist sortiert. Aber nicht alle IDs sind in der zweiten Datei, ist das nicht ein Problem? –

+0

Die Beispiel * file2 * -Daten sind _nicht_ sortiert. Sollte es sein? – agc

Antwort

1

Mit GNU beitreten und GNU bash:

join -t : -j 1 <(sort -t : -k1,1 file1) <(sort -t : -k1,1 file2) -o 1.2,2.2 

aktualisieren:

join -t: <(sort file1) <(sort file2) -o 1.2,2.2 
+0

@karakfa; Vielen Dank. Ich habe meine Antwort aktualisiert. – Cyrus

+0

nji $ join -t: <(Sortierung test1.in) <(Sortierung test2.in) -o 1.2,2.2 Verwendung: Join [-a Fileno | -v Dateino] [-e Zeichenfolge] [-1 Feld] [-2 Feld] [-o Liste] [-t Char] Datei1 Datei2 –

+0

Probieren: join-t: -o 1.2,2.2 <(sort test1. in) <(Art test2.in) : d63fff1d21e1a04c066824dd2f83f3aeaa0edf6e : 361e7976e4b783517aca819caf1322c2e0b8cd32 –

0

In AWK (nicht die Menge der Ressourcen unter Berücksichtigung Sie zur Verfügung haben):

$ awk -F':' 'NR==FNR{a[$1]=$2;next} a[$1] {print a[$1]":"$2}' test1.in test2.in 
[email protected] :d63fff1d21e1a04c066824dd2f83f3aeaa0edf6e 
Verwandte Themen