Mam diff, który zasadniczo równa się dodatkowe unikalne linie lub linie, które zostały przeniesione w pliku, a tym samym ich numery linii zostały zmienione. Aby ustalić, co jest naprawdę nowy dodatek, uruchomić ten mały perl fragment, aby oddzielić linie „rozwiązane” z „nierozwiązanych” linii:grep nie działa zbyt dobrze na dużych plikach, czy jest alternatywa?
perl -n -e'
/^\-([^\-].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDOUT "$1\n"; next; };
/^\+([^\+].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDERR "$1\n"; next; };
' "$delta" 1>resolved 2>unresolved
Jest to dość szybkie w rzeczywistości, a nie praca, oddzielając 6000 + linia zmienia się w dwa pliki o rozmiarze ponad 3000, usuwając wszelkie odniesienia do numerów linii i jednolitej dekoracji diff. Następnie przychodzi polecenie grep, który wydaje się działać na 100% CPU przez prawie 9 minut (Real):
grep -v -f resolved unresolved
ta jest zasadniczo usunięcie wszystkich rozwiązane wiersze z pliku nierozwiązany. Wyjście po 9 minutach jest przypadkowo 9 liniami wyjścia - unikalnymi dodatkami lub nierozwiązanymi liniami.
Po pierwsze, kiedy używałem grep w przeszłości, było w tym całkiem nieźle, więc dlaczego w tym przypadku jest wyjątkowo wolny i głodny procesor?
Po drugie, czy istnieje skuteczniejszy alternatywny sposób usuwania linii z jednego pliku zawartego w innym?
Okay, myślę, że odpowiedziałem trochę na moje własne pytanie liczbami. Grep analizuje 3000 wierszy pliku, potencjalnie 3000 razy, więc być może odpowiada to analizie pliku o wartości 9 000 000 wierszy. Ale to wciąż nie jest takie ogromne. To prawie tak, jakby grep zajmuje 60 sekund, aby przeanalizować 1 000 000 linii. – Craig
Zauważ, że '. * $' Jest bezużyteczne – ikegami
Oczywiście, ale pomyślałem, że może być trochę samotny bez $. :-) – Craig