Dafür gibt es viele Möglichkeiten. Hier sind ein paar, aber mit Perl ist es um Größenordnungen schneller. Ich füge die anderen der Vollständigkeit halber hinzu:
Perl und Haschisch, lächerlich schnell
perl -e 'open(A,"fileB"); while(<A>)++} while(<>){@a=split(/,/); print if defined $k{$a[0]}}' fileA
Gawk und assoziative Arrays, viel langsamer
gawk ' else}}' fileA fileB
grep
lächerlich langsam. Sie müssen Ihre fileB leicht modifizieren, damit die Muster nur in der ersten Zeile übereinstimmensed 's/\(.\)/^\1/' fileB > fileC grep -f fileC fileA
Ich habe ein paar Testdateien erstellt und es stellt sich heraus, dass die Perl-Lösungen viel schneller sind als die grep
:
$ head -2 fileA GO:0032513_GO:0050129 GO:0050129_GO:0051712 $ head -2 fileB GO:0032513_GO:0050129 GO:0050129_GO:0051712 $ wc -l fileA fileB 1500000 fileA 20000000 fileB $ time perl -e 'open(A,"fileB"); while(<A>)++} while(<>){@a=split(/,/); print if defined $k{$a[0]}}' fileA > /dev/null real 0m41.354s user 0m37.370s sys 0m3.960s $ time gawk ' else}}' fileA fileB real 2m30.963s user 1m23.857s sys 0m9.385s $ time (join -t, <(sort -n fileA) <(sort -n fileB) >/dev/null) real 8m29.532s user 13m52.576s sys 1m22.029s
Das Perl-Scriptlet kann also eine 20-Millionen-Zeilendatei nach 1,5 Millionen Mustern durchsuchen und in ~ 40 Sekunden enden. Nicht schlecht. Die anderen beiden sind viel langsamer, sie gawk
dauerten 2,5 Minuten und die grep
eine lief seit über 15 Jahren. Perl gewinnt zweifellos.