Jaka jest różnica między sed a awk? [Zamknięte]

497
  • Jaka jest różnica między awk a sed?
  • Jakie aplikacje najlepiej sprawdzają się w przypadku narzędzi sed i awk?
Rachel
źródło
2
Powiązana kontrola jakości na unix.stackexchange: Czy istnieje podstawowy samouczek dotyczący grep, awk i sed?
Dani

Odpowiedzi:

549

sedjest edytorem strumieniowym. Działa ze strumieniami znaków dla poszczególnych linii. Ma prymitywny język programowania, który zawiera pętle w stylu goto i proste warunki warunkowe (oprócz dopasowania wzorca i dopasowania adresu). Zasadniczo istnieją tylko dwie „zmienne”: przestrzeń wzoru i przestrzeń wstrzymania. Czytelność skryptów może być trudna. Operacje matematyczne są co najwyżej wyjątkowo niezręczne.

Istnieją różne wersje sedz różnymi poziomami wsparcia dla opcji wiersza poleceń i funkcji językowych.

awkjest zorientowany na pola rozdzielane liniami dla poszczególnych linii. Ma wiele bardziej wytrzymałe konstrukcje programistyczne w tym if/ else, while, do/ whilea for(C-stylu i macierzy iteracji). Istnieje pełne wsparcie dla zmiennych i jednowymiarowych tablic asocjacyjnych oraz tablic kludgey wielowymiarowych (IMO). Operacje matematyczne przypominają te w C. Ma printfi ma funkcje. „K” w „AWK” oznacza „ K ernighan”, podobnie jak w „Kernighan and Ritchie” sławy książki „C Programming Language” (nie zapominając o Ho i W einbergerze). Można sobie wyobrazić użycie wykrywacza akademickiego plagiatu awk.

GNU awk( gawk) ma wiele rozszerzeń, w tym prawdziwe tablice wielowymiarowe w najnowszej wersji. Istnieją inne odmiany awkobejmujące mawki nawk.

Oba programy używają wyrażeń regularnych do wybierania i przetwarzania tekstu.

Zwykle używam sedtam, gdzie są wzory w tekście. Na przykład możesz zamienić wszystkie liczby ujemne w tekście w postaci „znak minus, po którym następuje ciąg cyfr” (np. „-231.45”), w formie „nawiasów księgowych” (np. „(231,45)” ) przy użyciu tego (który ma pole do poprawy):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

Użyłbym, awkgdy tekst bardziej przypomina wiersze i kolumny lub, jak awksię je odnosi, „rekordy” i „pola”. Gdybym miał wykonać podobną operację jak powyżej, ale tylko na trzecim polu w prostym pliku rozdzielanym przecinkami, mógłbym zrobić coś takiego:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Oczywiście są to tylko bardzo proste przykłady, które nie ilustrują pełnego zakresu możliwości, jakie każdy ma do zaoferowania.

Wstrzymano do odwołania.
źródło
7
Aby zobaczyć przykłady przekraczania granic sed: sed.sourceforge.net/#scripts
Wstrzymano do odwołania.
@DennisWilliamson - Czy znajdę się w niekorzystnej sytuacji, jeśli nauczę się tylko awk? Czy awk jest znacznie częściej używany niż sed?
Steam,
4
@blasto: Polecam uczyć się obu, ale z większym naciskiem na awk. Wiele wyrażeń regularnych dotyczy zarówno (jak i innych narzędzi i języków). Używaj sed do prostszych rzeczy i staraj się unikać skomplikowanych rzeczy. To naprawdę fajne, że możesz robić pętle i gałęzie w sed, ale wynikowe linie poleceń są złożone i trudne do odczytania. Odpowiedź na twoje pytanie naprawdę zależy od tego, co robisz.
Wstrzymano do odwołania.
@DennisWilliamson - Co byłoby najbardziej przydatne dla programisty ETL? ETL lub Extract Transform and Load to termin hurtowni danych. Mówiąc prościej, zadanie obejmuje WYDOBYCIE danych z różnych różnych źródeł (takich jak DB, pliki Excel, pliki csv itp.), TRANSFORMACJA tego samego, a następnie ŁADOWANIE do magazynu danych (DW) w celu analizy, znajdowania wzorców w danych lub po prostu historycznych dokumentacja. na przykład. Ostateczne zastosowanie DW - Algorytmy zastosowane do DW sklepu spożywczego, który ma dane z ostatnich 10 lat, może ujawnić, że ludzie, którzy kupują jabłka, również kupują pomarańcze lub coś podobnego.
Steam,
1
Tylko FYI dla każdego, kto natknie się na to na Macu, spróbuj „sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'” na pierwszym przykładzie sed
Daniel Schmidt,
124

1) Jaka jest różnica między awk a sed?

Oba są narzędziami przekształcającymi tekst. ALE awk może robić więcej rzeczy niż tylko manipulowanie tekstem. Jest to język programowania sam w sobie z większością rzeczy, których uczysz się w programowaniu, takich jak tablice, pętle, sterowanie przepływem if / else itp. Możesz także „programować” w sed, ale nie chcesz, aby kod był w nim zapisany .

2) Jakie aplikacje najlepiej sprawdzają się w przypadku narzędzi sed i awk?

Wniosek: użyj sed do bardzo prostej analizy tekstu. Poza tym awk jest lepszy. W rzeczywistości możesz całkowicie rzucić sed i po prostu użyć awk. Ponieważ ich funkcje się pokrywają, awk może zrobić więcej, wystarczy użyć awk. Zmniejszysz również swoją krzywą uczenia się.

ghostdog74
źródło
7
Fajna uwaga na temat krzywej uczenia się .. zbyt wiele narzędzi może się pomieszać .. więc wolałbym uczyć się tylko grep i awk .. zapomnijmy o sed :)
Outlier
174
^^ Dość sed. (przepraszam, musiałem)
Greg M. Krsak
8
Uważam, że sed jest o wiele łatwiejszy do nauczenia, więc musisz się z tym pogodzić. Gdy nauczysz się opanowywać awk, przydatne może być szybkie nauczenie się sed, aby móc go szybciej używać do rzeczy, których jeszcze nie wiesz, jak robić w awk.
Didier A.
1
@GregKrsak zrobiłeś mój dzień. (przepraszam, musiałem)
Abel Callejo
15
Nie rób tego sed, 's/search/replace'jest o wiele łatwiejszy do pisania niż awkskładnia i jest tym, czego potrzebujesz przez większość czasu.
sjas
54

Oba narzędzia są przeznaczone do pracy z tekstem i są zadania, do których można użyć obu narzędzi.

Dla mnie reguła, aby je rozdzielić to: Użyj seddo automatyzacji zadań, które w innym przypadku zrobiłbyś w edytorze tekstu ręcznie. Dlatego nazywa się to edytorem strumieniowym . (Możesz użyć tych samych poleceń, aby edytować tekst w vimie). Użyj, awkjeśli chcesz analizować tekst, co oznacza zliczanie pól, obliczanie sum, wyodrębnianie i reorganizację struktur itp.

Również nie powinieneś zapominać o grep. Użyj, grepjeśli chcesz tylko przeszukać / wyodrębnić coś w tekście (pliku)

hek2mgl
źródło