Jakie są różnice między Perlem, Pythonem, AWK i sedem? [Zamknięte]


253

chcesz wiedzieć, jakie są między nimi główne różnice? oraz moc każdego języka (tam, gdzie lepiej go używać).

Edycja: to nie jest „vs.” jak temat, tylko informacja.


142
Tego rodzaju tak zwane niekonstruktywne pytania są naprawdę pomocne.
Steam,

10
Jasne, zakładka na pierwszej stronie, aby je znaleźć, byłaby przydatna ...

Przydatność pytona w wierszu poleceń, patrz pyp
Neil McGuigan,

Odpowiedzi:


550

W kolejności pojawiania się, że języki są sed, awk, perl, python.

sedProgram to edytor strumień i jest przeznaczony do zastosowania działań ze skryptu do każdej linii (lub, bardziej ogólnie, do określonych zakresach linii) pliku wejściowego lub plików. Jego język jest oparty na ededytorze uniksowym i chociaż ma warunki warunkowe i tak dalej, ciężko jest pracować z nim przy złożonych zadaniach. Dzięki temu możesz dokonywać drobnych cudów - ale kosztem włosów na głowie. Jest to jednak prawdopodobnie najszybszy z programów podczas próby wykonania zadań w ramach jego kompetencji. (Zawiera najmniej wydajne wyrażenia regularne omawianych programów - odpowiednie do wielu celów, ale na pewno nie PCRE - wyrażenia regularne zgodne z Perlem)

awkProgramu (nazwa pochodzi od inicjałów jego autorów - Aho, Weinberger i Kernighana) jest narzędziem początkowo do formatowania raportów. Może być stosowany jako przysmak sed; w nowszych wersjach jest obliczeniowo ukończony. Wykorzystuje ciekawy pomysł - program opiera się na „dopasowanych wzorach” i „działaniach podejmowanych, gdy wzorce się zgadzają”. Wzorce są dość potężne (Rozszerzone wyrażenia regularne). Język akcji jest podobny do C. Jedną z kluczowych cech awkjest to, że automatycznie dzieli dane wejściowe na rekordy, a każdy rekord na pola.

Perl został napisany częściowo jako zabójca awk i sed zabójca. Dwa z programów dostarczonych z nim są a2pi s2pdo konwersji awkskryptów i sedskrypty w Perlu. Perl jest jednym z najwcześniejszych języków skryptowych nowej generacji (Tcl / Tk prawdopodobnie może rościć sobie pierwszeństwo). Ma potężną, zintegrowaną obsługę wyrażeń regularnych o znacznie potężniejszym języku. Zapewnia dostęp do prawie wszystkich wywołań systemowych i ma rozszerzalność modułów CPAN. (Ani awknie sedjest rozszerzalny.) Jednym z mottów Perla jest „TMTOWTDI - Jest na to więcej niż jeden sposób” (wymawiane jako „tim-toady”). Perl ma „obiekty”, ale jest to raczej dodatek niż podstawowa część języka.

Python został napisany jako ostatni i prawdopodobnie częściowo jako reakcja na Perla. Ma kilka interesujących pomysłów składniowych (wcięcia w celu wskazania poziomów - brak nawiasów klamrowych lub odpowiedników). Jest bardziej zorientowany obiektowo niż Perl; jest tak samo rozszerzalny jak Perl.

OK - kiedy z nich korzystać?

  • Sed - gdy trzeba wykonać proste przekształcenia tekstu w plikach.
  • Awk - gdy potrzebujesz tylko prostego formatowania i podsumowania lub transformacji danych.
  • Perl - do prawie każdego zadania, ale szczególnie gdy zadanie wymaga złożonych wyrażeń regularnych.
  • Python - do tych samych zadań, do których możesz użyć Perla.

Nie jestem świadomy niczego, co Perl może zrobić, czego nie potrafi Python, i odwrotnie. Wybór między tymi dwoma zależeć będzie od innych czynników. Nauczyłem się Perla, zanim powstał Python, więc zwykle go używam. Python ma mniej akredytowaną składnię i ogólnie jest nieco łatwiejszy do nauczenia się. Perl 6, gdy będzie dostępny, będzie fascynującym wydarzeniem.

(Zwróć uwagę, że w szczególności „przeglądy” Perla i Pythona są żałośnie niepełne; na ten temat można napisać całe książki).


82
Post ++++, przeczytam jeszcze raz!
Robert Gamble

24
niesamowite, zwłaszcza „kiedy użyć każdej” części
Khaled Al Hourani

6
Zauważ, że zen Pythona jest w zasadzie antytezą TMTOWTDI, więc powiedziałbym, że może to być reakcja na Perla. iirc TCL pojawił się nieco po perlu i jest dość reakcyjny w stosunku do perla, chociaż reakcja TCL ma składnię i złożoność językową, a nie sposoby robienia rzeczy
jk.

7
Niezależnie od pierwotnych intencji, jasne jest, że późniejszy rozwój Pythona i społeczność Pythona wolały czytelność i spójność od bardziej elastycznej, ale zwięzłej składni Perla. Doskonały post Jonathan
Martin Beckett,

4
@blasto: Dla ETL, bym priorytet awknad seddo nauki (choć oba nadal mają zastosowanie). Jeśli chodzi o rozmiar zadania: sedjest w najlepszym wydaniu, gdy przetwarza jedną linię na raz, bez pamięci między liniami. awkjest często wykorzystywany do tworzenia tablic asocjacyjnych z danymi zgromadzonymi ze wszystkich źródeł; zużywa więcej pamięci i dlatego jest znacznie bardziej narażony na problemy z dużymi zestawami danych niż sedjest. Nie słyszałem o tym tsawkwcześniej. Mam tendencję do polegania na Perlu (ale lepiej radzisz sobie z Pythonem), gdy zadanie jest zbyt trudne awk.
Jonathan Leffler,

91

Po opanowaniu kilkudziesięciu języków znudziły się osoby takie jak S. Lott (zobacz jego kontrowersyjną odpowiedź na to pytanie, prawie o połowę mniej głosów niż w górę (+ 45 / -22) sześć lat po udzieleniu odpowiedzi).

Sed jest najlepszym narzędziem do bardzo prostych rurociągów wiersza poleceń. W rękach mistrza sed jest odpowiedni do jednorazowych działań o dowolnej złożoności, ale nie powinien być stosowany w kodzie produkcyjnym, z wyjątkiem bardzo prostych potoków zastępczych. Rzeczy takie jak „s / this / that /.”

Gawk (GNU awk) jest zdecydowanie najlepszym wyborem do złożonego formatowania danych, gdy istnieje tylko jedno źródło wejściowe i jedno wyjście (lub wiele wyjść zapisanych kolejno). Ponieważ duża część pracy w świecie rzeczywistym jest zgodna z tym opisem, a dobry programista może nauczyć się gawk w ciągu dwóch godzin, jest to najlepszy wybór. Na tej planecie łatwiej i szybciej jest lepiej!

Perl lub Python są znacznie lepsze niż jakakolwiek wersja awk lub sed, gdy masz bardzo złożone scenariusze wejścia / wyjścia. Im bardziej złożony jest problem, tym lepiej używasz Pythona z punktu widzenia konserwacji i czytelności. Zauważ jednak, że dobry programista może pisać czytelny kod w dowolnym języku, a zły programista może pisać nie dające się utrzymać bzdury w dowolnym przydatnym języku, więc wybór perla lub pytona można bezpiecznie pozostawić preferencjom programisty, jeśli programista jest wykwalifikowany i sprytny.


9
100% uzgodnione. Wiedza większości, jeśli nie wszystkich narzędzi ORAZ kiedy ich używać, odróżnia dobrego technika od przeciętnego.
ata

6
Dodam, że innym powodem wyboru Pythona lub Perla zamiast awk jest to, że twoje wymagania transformacji obejmują złożoną weryfikację lub logikę, dla których inny język ma istniejący, solidny moduł. Zastanów się, co trzeba zrobić, aby poprawnie obsługiwać np. Adresy e-mail lub adresy w awk, a zobaczysz, co mam na myśli: perl i python mają biblioteki, które sprawiają, że takie rzeczy są trywialne, w awk są one rzadkie lub niedostępne.
sorpigal

3
W rzeczywistości, ponieważ Perl miał obejmować zarówno Sed, jak i Awk; Łatwiej jest mi napisać to w Perlu, niż uczyć się Sed lub Awk.
Brad Gilbert

@BradGilbert: tak jak wspomniałem w pierwszej odpowiedzi, zastrzeżeniem Perla (i Pythona, ruby ​​itp.) W stosunku do awk jest to, że niektóre wyrażenia regularne są reaaaaaaaaa o wiele wolniejsze w poprzednim: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac

1
@OlivierDulac Tak, który pokazuje przypadek patologiczny. Jeśli zmienisz z a?ⁿaⁿna, a??ⁿaⁿto uruchom to w Perlu 5 z 1 000 000 uruchomi się w mniej niż dwie sekundy. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Jeśli uruchomisz ten naiwny, zajmie to więcej niż dwie sekundy dla zaledwie 25. Musisz zrozumieć, że Perl ma więcej funkcji wyrażenia regularnego niż te szybsze, w tym pozwala na umieszczenie w wyrażeniu kodu Perla, który zmienia to, co pasuje . Możesz zaimplementować moduł, który zamienia wbudowany na jeden z tych innych, jeśli chcesz.
Brad Gilbert,

21

Nie nazwałbym sed pełnoprawnym językiem programowania, jest to edytor strumieniowy z konstrukcjami językowymi służącymi do programowej edycji plików tekstowych.

Awk jest trochę bardziej językiem ogólnego przeznaczenia, ale nadal najlepiej nadaje się do przetwarzania tekstu.

Perl i Python są pełnoprawnymi językami programowania ogólnego przeznaczenia. Perl ma swoje korzenie w przetwarzaniu tekstu i ma wiele konstrukcji podobnych do awk (w sieci krąży nawet skrypt awk-to-perl). Istnieje wiele różnic między Perlem a Pythonem. Najlepiej jest przeczytać streszczenia obu języków na czymś takim jak Wikipedia, aby dobrze zrozumieć, czym one są.


2
Widziałem sedową implementację Sokoban, która sugerowałaby Turinga Kompletność. Można to również powiedzieć o sendmail.cf i TeX.
ConcernedOfTunbridgeWells

7
Pracowałem kiedyś z facetem, który napisał PostScript, aby zmienić drukarkę laserową w router.
Sam Kington,

10
@Sam: Wow! Nie wiedziałem, że laser drukarki może być wystarczająco podkręcony, aby ciąć drewno! Przepraszam, zły rodzaj routera.
Wstrzymano do odwołania.

2
sed, nie pełnoprawny język? Cóż, to nie do końca prawda, ponieważ sed jest już gotowy ;)
Bernard Paul

1
W awk widziałem implementację czwartego języka. (Ponieważ awk może być traktowany jako samodzielny parser, zaimplementowanie w nim interpretera jest raczej proste).
Tatjana Heuser

19

Po pierwsze, na liście „Perl, Python awk i sed” znajdują się dwie niepowiązane rzeczy.

Rzecz 1 - uproszczone narzędzia do manipulacji tekstem.

  • sed. Ma ustalony, stosunkowo prosty zakres pracy określony przez pomysł czytania i sprawdzania każdej linii pliku. sed nie jest zaprojektowany tak, aby był szczególnie czytelny. Został zaprojektowany tak, aby był bardzo mały i bardzo wydajny na bardzo małych serwerach unix.

  • awk. Ma nieco mniej ustalony, mniej prosty zakres pracy. Jednak główna pętla programu awk jest zdefiniowana przez niejawne czytanie wierszy pliku źródłowego.

Nie są to „kompletne” języki programowania. Chociaż możesz - przy odrobinie pracy - pisać dość zaawansowane programy w awk, szybko się komplikuje i jest trudny do odczytania.

Rzecz 2 - języki programowania ogólnego zastosowania. Mają one bogatą różnorodność typów instrukcji, liczne wbudowane struktury danych oraz brak wbudowanych założeń i skrótów, o których można mówić.

  • Perl

  • Pyton.

Kiedy ich używać.

  • sed. Nigdy. Naprawdę nie ma żadnej wartości we współczesnej erze komputerów z ponad 32 KB pamięci. Perl lub Python robią to samo wyraźniej.

  • awk. Nigdy. Podobnie jak sed, odzwierciedla wcześniejszą erę komputerów. Zamiast utrzymywać ten język (oprócz wszystkich innych wymaganych dla udanego systemu), przyjemniej jest po prostu robić wszystko w jednym przyjemnym języku.

  • Perl Wszelkie problemy z programowaniem dowolnego rodzaju. Jeśli lubisz swobodnie myślącą składnię, w której jest wiele sposobów na zrobienie tego samego, Perl jest fajny.

  • Pyton. Wszelkie problemy z programowaniem dowolnego rodzaju. Jeśli lubisz dość ograniczoną składnię, w której jest mniej opcji, mniej subtelności i (być może) większej przejrzystości. Zorientowana obiektowo natura Pythona sprawia, że ​​jest bardziej odpowiedni dla dużych, złożonych problemów.

Tło - nie walę sedem i wybijam się z ignorancji. Nauczyłem się awk ponad 20 lat temu. Zrobił z tym wiele rzeczy; używane do nauczania go jako podstawowej umiejętności uniksowej. Nauczyłem się Perla około 15 lat temu. Zrobił z nim wiele wyrafinowanych rzeczy. Zostawiłem oba, ponieważ mogę robić te same rzeczy w Pythonie - i jest to prostsze i bardziej przejrzyste.

Istnieją dwa poważne problemy z sed i awk, z których żaden nie jest w ich wieku.

  1. Niekompletność ich wdrożenia. Wszystko, co robią sed i awk, można zrobić w Pythonie lub Perlu, często prościej, a czasem także szybciej. Potok potoku ma pewne zalety pod względem wydajności ze względu na wielorakie przetwarzanie. Python oferuje subprocessmoduł, który pozwala mi odzyskać te zalety.

  2. Potrzeba nauki jeszcze jednego języka. Robiąc rzeczy w Pythonie (lub Perlu), twoja implementacja zależy od mniejszej liczby języków, co powoduje zwiększenie przejrzystości.


66
Kilka dość głupich argumentów przeciwko awk / sed. Klucz nastawny nie zastąpił klucza płaskiego z tego samego powodu, dla którego sed i awk wciąż są dostarczane. Czasami proste narzędzie jest najlepsze do pracy. Piszę dużo perla, ale dla prostego łańcucha potokowych poleceń awk / sed są szybsze niż perl -e
RET

27
Nie można zakładać dostępności niczego oprócz sh, sed i awk w większości systemów unixowych innych niż Linux. Jeśli chcesz, aby coś działało na gotowej instalacji Solaris, HP / UX lub AIX, utkniesz w sed i awk.
ConcernedOfTunbridgeWells

27
Połowa moich skryptów powłoki używa sed lub awk. Daleko im do śmierci. Python jest moim preferowanym językiem skryptowym, ale czasami sed i awk są najlepszym narzędziem do tego zadania. To, że są używane od wielu lat, nie oznacza, że ​​są przestarzałe.
Jeremy Cantrell,

16
@ S.Lott: Nie sugeruję, że ktokolwiek powinien próbować zbudować aplikację internetową w awk, ale stwierdzenie, że nigdy nie należy jej używać, jest nieco oburzające. W przypadku prostych poprawek s & r i / lub (szczególnie do pliku tekstowego z ogranicznikami), perl -e lub python -c nigdy nie będzie tak wydajny jak jednowarstwowy sed / awk.
RET,

25
Nie lubię takich odpowiedzi. Sed i awk są łatwe do zrozumienia w ciągu kilku godzin i są znacznie lżejsze i szeroko dostępne niż w pełni rozwinięty język. Programowanie w powłoce jest tak samo aktualne jak zawsze, mówiąc, że „NIGDY” nie należy używać tego lub tego narzędzia jest po prostu opóźnione. Ale czy ten opóźniony pomysł nie był jedną z podstaw, na której pojawił się Perl? No cóż ...
ata

14

Kiedy ich używać: awk - nigdy - S. Lott.

Myślę, że S. Lott nieznacznie nie trafił w tę rekomendację. Faktem jest, że w Linuksie i innych środowiskach UNIX awk jest użytecznym narzędziem do użycia z bash, sh i ksh do szybkiego przetwarzania tekstu. Sam pomysł pisania skryptów polega na tym, że rozwiązujesz problem, sklejając ze sobą to narzędzie, to narzędzie. Dlatego w skryptach administracyjnych często występują ls, grep, |, awk, time, ps itp. Każde z nich to narzędzie, które scripter łączy jak cegła budownicza cegła po cegle, aby ukończyć budynek (aby rozwiązać dany problem) .

Na przykład jestem członkiem zespołu zarządzającego zespołem dostawami sprzętu do paintballadotcom. Ta strona e-commerce opiera się na stosie LAMP. Do zautomatyzowanego przetwarzania i normalizacji plików danych od różnych dostawców do wewnętrznej bazy danych stosujemy i utrzymujemy zróżnicowaną kombinację skryptów, w tym bash, perl, php, a nawet oczekujemy. Każdy ma swoje mocne strony w oparciu o dostępne moduły i API. W skryptach bash wykonujemy szybkie dopasowywanie wzorców i odpowiednie działania na wzorach w razie potrzeby za pomocą awk bez konieczności przełączania się na PERL. Jedną rzeczą, na którą chciałbym zwrócić uwagę, która nie została podkreślona w tym wątku, jest to, że spora liczba tych skryptów została zakupiona lub otrzymana z otwartego źródła. Jeśli skrypt przyszedł jako Perl, zachowujemy go jako Perl; jeśli skrypt przyszedł jako Php, utrzymujemy go jako Php; jeśli przyszedł jako bash, utrzymujemy go jako bash;


7
to S.Lott napisał odpowiedź, którą zacytowałeś, nie brian d foy ...
plusplus

5
na marginesie tej dość starej odpowiedzi: nigdy nie analizuj wyniku ls, zamiast tego użyj glob. Przeczytaj to.
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.