Jakie są dokładnie różnice między awk a cut za pomocą grep? [Zamknięte]


30

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 awknad używaniem cuti odwrotnie?
  • Jakie opcje awkdaje nam cuti na odwrót?

czy to echo filenameczy cat filename?
Avinash Raj

@AvinashRaj przepraszam, edytowano
Networker

Odpowiedzi:


35

Najbardziej widoczna różnica między twoimi dwiema liniami będzie zależeć od danych wejściowych. cutprzyjmuje pojedynczy znak -djako ogranicznik pola (domyślnie TAB), a każde wystąpienie tego znaku rozpoczyna nowe pole. awkjest jednak bardziej elastyczny. Separator znajduje się w FSzmiennej 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. Ponadto awkdomyślnie pomija wiodące białe znaki.

Proszę porównać:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

Tu awkrozdziela na sekwencji odstępów między abca def, podczas gdy cutwykonuje każdą przestrzeń jako separator.

To, co weźmiesz, będzie zależeć od tego, co chcesz osiągnąć. W przeciwnym razie spodziewałbym cutsię, że będzie szybszy, ponieważ jest to mniejsze narzędzie do jednego celu, a jednocześnie awkma swój własny język programowania.


że to, czego chcę jako odpowiedź, dziękuję oznaczę pytanie jako odpowiedź @Dubu
Networker

1
cutprawdopodobnie będzie szybszy niż sam Awk , ale nie jest tak pewien, że grep ... | cutbędzie szybszy niż czysty Awk.
Wildcard

8

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ć cuti grepbyć szybszym niż sedi sedbyć 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¹).

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

Te polecenia są prawie równoważne. Różnice są następujące:

  • awk i grep mają różne składnie wyrażeń regularnych . Awk i grep -Emają 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ów cut. 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


1

Twoje rozkaz

cat fileName | awk '/WORD/ { print $2 }'

Nie potrzebujesz nawet catpolecenia. Możesz spróbować

awk '/WORD/ { print $2 }' filename

A poniższe polecenie przekierowuje wyjście z cat na grep, a następnie do cięcia,

cat fileName | grep WORD | cut -f 2 -d ' '

Najprawdopodobniej musimy unikać przekierowania danych wyjściowych. Awk wykonuje pracę w jednym wierszu, alecut potrzebuje greppolecenia, 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.


3
ps nie potrzebujesz komendy cat do grep. Możesz po prostu zrobić grep WORD filename.
phoops

@ edvinas.me tak.
Avinash Raj
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.