Mam duży plik złożony z pól tekstowych oddzielonych średnikami w postaci dużej tabeli. Zostało posortowane. Mam mniejszy plik złożony z tych samych pól tekstowych. W pewnym momencie ktoś połączył ten plik z innymi, a następnie zrobił coś w celu utworzenia dużego pliku opisanego powyżej. Chciałbym odjąć wiersze małego pliku od dużego (tj. Dla każdej linii w małym pliku, jeśli w dużym pliku istnieje pasujący ciąg, usuń tę linię w dużym pliku).
Plik wygląda mniej więcej tak
GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;
itp
Czy jest na to szybki, elegancki sposób, czy muszę użyć awk?
files
text-processing
diff
Escher
źródło
źródło
-x
opcją, na wypadek gdyby linia w mniejszym pliku spotkała się z podciągiem innej linii w głównym pliku. Jest też całkiem możliwe, że odpowiedź @ UlrichSchwarz jest szybsza.comm
jest twoim przyjacielem:(
comm
prawdopodobnie będzie miał przewagę nad wydajnością,grep
ponieważ bierze pod uwagę sortowanie).Na przykład:
źródło
comm -1 -3 file.txt bigfile.txt > newbigfile.txt
comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)