Mam 2 duże pliki tekstowe (~ 500M, ~ 15GB ea), które wyglądają tak:
PlikP.txt:
[email protected]: testtest [email protected]: testtest1 [email protected]: testtest2 [email protected]: testtest3 [email protected]: 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:
[email protected]: testtest1 [email protected]: 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.
źródło
diff FileP.txt File.txt
i zachować tylko wiersze z prefiksem<
?Odpowiedzi:
Jeśli pliki są posortowane, wykonaj
comm
porównuje dwa posortowane pliki, szukając wspólnych linii. Na przykład, biorąc pod uwagę ten plik kolorów, których nazwy zaczynają się od spółgłosek:i ta lista kolorów, których nazwy kończą się samogłosek:
polecenie
comm colors1 colors2
tworzy następujące dane wyjściowe:gdzie:
pierwsza kolumna zawiera kolory, które zaczynają się i kończą spółgłosek (in
colors1
ale niecolors2
), druga kolumna zawiera kolory, które zaczynają się i kończą samogłoskami (incolors2
ale niecolors1
), a trzecia kolumna zawiera kolory, które zaczynają się spółgłosek i kończą samogłoskami (zarównocolors1
icolors2
).comm fileP.txt fileE.txt
Tworzy pliki (pokazane w pytaniu)Opcje są trochę nieintuicyjne:
-23
oznacza pomijanie drugiej i trzeciej kolumny, pokazując tylko pierwszą (linie, które są w pierwszym pliku, ale nie w drugiej). Więc,Pamiętaj, że to nie będzie działać poprawnie, jeśli pliki nie zostaną posortowane. Jeśli pliki nie są sortowane, posortuj je.
źródło
Aby powiększyć komentarz xenoid , posortuj pliki i wpisz
Dane wyjściowe
diff
pokazują wiersze znajdujące się tylko w pierwszym pliku, poprzedzone znakiem<
, oraz wiersze znajdujące się tylko w drugim pliku, poprzedzone znakiem>
. Wsed
zaledwie wybiera linie, które zaczynają się<
i taśmy ją.źródło