Szukam polecenia lub skryptu, aby wykonać następujące czynności - dane:
plik1.txt:
abcd
efgh
ijkl
mnop
plik2.txt:
123abcd123
123efgh123
123mnop123
Chcę polecenia, które robi coś takiego:
ungrep file1.txt file2.txt
i zwraca:
ijkl
Innymi słowy, daje mi wiersze w pliku1.txt, które nie zwrócą żadnych wyników dla grep pliku2.txt. Wiem, że mogę to zrobić, wykonując iterację przez plik1.txt, grepping file2.txt dla każdej linii i zapisując wynik, i wypisując dowolne linie, w których wynik jest pusty, ale liczyłem na bardziej skuteczny sposób, aby to zrobić.
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
ale, podobnie jak twoje rozwiązanie, działa to tylko wtedy, gdy plik wzorca nie zawiera żadnych metaznaków wyrażeń regularnych.grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Możesz to zrobić za pomocą
awk
:Używając
index
, szukamy podciągów zamiast dopasowywania wyrażeń regularnych.Ponieważ usuwamy słowo z tablicy, gdy tylko znajdziemy dopasowanie, unikamy niepotrzebnych wyszukiwań.
źródło
w[$0]
sama ocena ma efekt uboczny dodania klucza do tablicy.if (a[$1])
zamiast,if ($1 in a)
na przykład. To sprawa każdegoawk
w tym oryginalnaawk
inawk
, ale patrząc na standardowym wczoraj, nie mogłem znaleźć to określone.file1
nie jest ogromny (dla pewnej wartości ogromnej), wolę to rozwiązanie, ponieważ nie wymaga żadnego sortowaniafile2
i oczekuje się, że będzie znacznie bardziej wydajne.