Wiemy, że możemy uzyskać drugą kolumnę wiersza, który chcemy z pliku, używając tych dwóch technik:
awk '/WORD/ { print $2 }' filename
lub
grep WORD filename| cut -f 2 -d ' '
Moje pytania to:
- Jakie są różnice między dwoma powyższymi poleceniami?
- Który ma najlepszą wydajność?
- Jakie są zalety używania
awk
nad używaniemcut
i odwrotnie? - Jakie opcje
awk
daje namcut
i na odwrót?
awk
grep
performance
cut
Networker
źródło
źródło
echo filename
czycat filename
?Odpowiedzi:
Najbardziej widoczna różnica między twoimi dwiema liniami będzie zależeć od danych wejściowych.
cut
przyjmuje pojedynczy znak-d
jako ogranicznik pola (domyślnie TAB), a każde wystąpienie tego znaku rozpoczyna nowe pole.awk
jest jednak bardziej elastyczny. Separator znajduje się wFS
zmiennej i może być pustym łańcuchem (każdy znak wejściowy tworzy osobne pole), pojedynczym znakiem lub wyrażeniem regularnym. Specjalny przypadek pojedynczego znaku spacji (domyślny) oznacza podział na dowolną sekwencję białych znaków. Ponadtoawk
domyślnie pomija wiodące białe znaki.Proszę porównać:
Tu
awk
rozdziela na sekwencji odstępów międzyabc
adef
, podczas gdycut
wykonuje każdą przestrzeń jako separator.To, co weźmiesz, będzie zależeć od tego, co chcesz osiągnąć. W przeciwnym razie spodziewałbym
cut
się, że będzie szybszy, ponieważ jest to mniejsze narzędzie do jednego celu, a jednocześnieawk
ma swój własny język programowania.źródło
cut
prawdopodobnie będzie szybszy niż sam Awk , ale nie jest tak pewien, żegrep ... | cut
będzie szybszy niż czysty Awk.Ogólnie rzecz biorąc, im bardziej specjalistyczne jest narzędzie, tym jest ono szybsze. Więc w większości przypadków możesz oczekiwać
cut
igrep
być szybszym niżsed
ised
być szybszym niżawk
. Jeśli kompilujesz dłuższe potoki prostszych narzędzi za pomocą pojedynczego wywołania bardziej złożonego narzędzia, nie ma ogólnej zasady. Ma to znaczenie tylko przy dużych nakładach (powiedzmy, milionach linii); w przypadku krótkich nakładów nie zobaczysz żadnej różnicy.Zaletą bardziej złożonych narzędzi jest oczywiście to, że mogą robić więcej rzeczy.
Twoje polecenia niepotrzebnie wykorzystują kota. Zamiast tego użyj przekierowania (szczególnie jeśli martwisz się szybkością, ale prawdopodobnie nie powinieneś się martwić szybkością, dopóki nie uruchomisz testów porównawczych¹).
Te polecenia są prawie równoważne. Różnice są następujące:
grep -E
mają prawie identyczne składnie wyrażeń regularnych (rozszerzone wyrażenia regularne).cut -d ' '
traktuje każdy znak spacji jako separator. Domyślnym ogranicznikiem Awk jest dowolna sekwencja białych znaków, która może być wieloma spacjami, tabulatorami itp. Nie można używać dowolnych sekwencji białych znaków jako separatorówcut
. Aby użyć pojedynczych spacji jako separatorów w awk, ustaw separator pól na wyrażenie regularne pasujące do pojedynczej spacji, inne niż wyrażenie regularne składające się z pojedynczej spacji (co jest szczególnym przypadkiem oznaczającym „dowolną sekwencję białych znaków”, tj. Domyślną):awk -F '[ ]' '/WORD/ {print $2}'
.¹ Pierwsza zasada optymalizacji programu: nie rób tego. Druga zasada optymalizacji programu (tylko dla ekspertów!): Nie rób tego jeszcze. - Michael A. Jackson
źródło
Twoje rozkaz
Nie potrzebujesz nawet
cat
polecenia. Możesz spróbowaćA poniższe polecenie przekierowuje wyjście z cat na grep, a następnie do cięcia,
Najprawdopodobniej musimy unikać przekierowania danych wyjściowych. Awk wykonuje pracę w jednym wierszu, ale
cut
potrzebujegrep
polecenia, aby uzyskać tylko wiersze zawierające określone słowo i wypisuje kolumnę 2 zgodnie z odstępem ogranicznika.Możesz robić rzeczy w awk, jeśli cięcie się nie powiedzie.
źródło
grep WORD filename
.