Mam 2 duże pliki tekstowe (~ 500M, ~ 15GB ea), które wyglądają tak:
PlikP.txt:
test@test.com: testtest test@test.com1: testtest1 test@test.com2: testtest2 test@test.com3: testtest3 test@test.com4: testtest4
PlikE.txt
test@test.com:testtest
test@test.com0:testtest0
test@test.com2:testtest2
test@test.com3:testtest3
test@test.com5:testtest5
(Zauważ, jak FileE.txt
ma linie, które nie są w FileP.txt
środku. Nie chcę ich uwzględniać. Pogrubione linie to linie, które powinny się w końcu znaleźć output.txt
, ponieważ nie są w środku FileE.txt
.)
Chcę uruchomić FileE.txt
przed FileP.txt
i usunąć wszystkie wiersze, które zostały znalezione w FileE.txt
od FileP.txt
i wyjście do nowego pliku.
To powinno wyglądać tak:
Output.txt:
test@test.com1: testtest1 test@test.com4: testtest4
Próbowałem kilku poleceń,
Oto moje polecenie grep:
$ grep -Fvxf FileE.txt FileP.txt > output.txt
Jednak pojawia się ten błąd (oczywiście, ponieważ pliki są zbyt duże):
grep: memory exhausted
Dla zainteresowanych uruchomione $ ulimit -a
zwroty:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 2032
cpu time (seconds, -t) unlimited
max user processes (-u) 256
virtual memory (kbytes, -v) unlimited
Więc moje pytanie brzmi: jaki byłby najbardziej wydajny i najłatwiejszy sposób na zakończenie tego procesu?
UWAGA: Pliki nie są sortowane.
diff FileP.txt File.txt
i zachować tylko wiersze z prefiksem <
?