Mam plik1, który ma kilka linii (dziesiątek) i znacznie dłuższy plik2 (~ 500 000 linii). Wiersze w każdym pliku nie są identyczne, chociaż istnieje podzbiór identycznych pól. Chcę pobrać pola 3-5 z każdej linii w pliku1 i wyszukać plik2 dla tego samego wzorca (tylko te trzy pola, w tej samej kolejności - w pliku2, mieszczą się w polach 2-4). Jeśli znaleziono dopasowanie, to chcę usunąć odpowiednią linię z pliku1.awk/sed/grep, aby usunąć linie pasujące do pól w innym pliku
Np plik1:
2016-01-06T05:38:31 2016-01-06T05:23:33 2016006 120E A TM Current
2016-01-06T07:34:01 2016-01-06T07:01:51 2016006 090E B TM Current
2016-01-06T07:40:44 2016-01-06T07:40:41 2016006 080E A TM Alt
2016-01-06T07:53:50 2016-01-06T07:52:14 2016006 090E A TM Current
2016-01-06T08:14:45 2016-01-06T08:06:33 2016006 080E C TM Current
plik2:
2016-01-06T07:35:06.87 2016003 100E C NN Current 0
2016-01-06T07:35:09.97 2016003 100E B TM Current 6303
2016-01-06T07:36:23.12 2016004 030N C TM Current 0
2016-01-06T07:37:57.36 2016006 090E A TM Current 399
2016-01-06T07:40:29.61 2016006 010N C TM Current 0
... (i do 500.000 linii)
Więc w tym przypadku, chcę usunąć czwartej linii z pliku1 (na miejscu).
Poniższa znajdzie linie Chcę usunąć:
grep "$(awk '{print $3,$4,$5}' file1)" file2
Więc jedno rozwiązanie może być do tego celu rury sed, ale jestem jasne, w jaki sposób ustawić wzorzec dopasowania w sed od wejścia rurami. Wyszukiwanie w Internecie sugeruje, że awk może to wszystko zrobić (a może sed, lub coś innego), zastanawiając się, jak mogłoby wyglądać czyste rozwiązanie.
Prędkość jest również ważna, ponieważ inne procesy mogą próbować modyfikować pliki podczas ich wykonywania (wiem, że może to spowodować więcej komplikacji ...). Dopasowania zwykle znajdują się na końcu pliku 2, a nie na początku (w przypadku, gdy istnieje sposób na wyszukiwanie pliku 2 od dołu do góry).
pluse-uno na doskonale opisanym problemem. Kontynuuj wysyłkę i powodzenia. – shellter