Apa perbedaan antara sed dan awk? [Tutup]

497
  • Apa perbedaan antara awk dan sed?
  • Apa jenis aplikasi kasus penggunaan terbaik untuk sed dan alat awk?
Rachel
sumber

Jawaban:

550

sedadalah editor aliran. Ini bekerja dengan aliran karakter pada basis per-line. Ini memiliki bahasa pemrograman primitif yang mencakup loop gaya goto dan persyaratan sederhana (selain pencocokan pola dan pencocokan alamat). Pada dasarnya hanya ada dua "variabel": ruang pola dan ruang tahan. Keterbacaan skrip bisa sulit. Operasi matematika sangat canggung.

Ada berbagai versi seddengan level dukungan yang berbeda untuk opsi baris perintah dan fitur bahasa.

awkberorientasi pada bidang yang dibatasi pada basis per-baris. Ini memiliki jauh lebih kuat konstruksi pemrograman termasuk if/ else, while, do/ whiledan for(C-gaya dan berbagai iterasi). Ada dukungan lengkap untuk variabel dan array asosiatif dimensi-tunggal plus (IMO) array multi-dimensi kludgey. Operasi matematika mirip dengan yang ada di C. Ini memiliki printfdan berfungsi. "K" dalam "AWK" adalah singkatan dari " K ernighan" seperti dalam "Kernighan dan Ritchie" dari buku "C Programming Language" ketenaran (jangan lupa A ho and W einberger). Seseorang dapat dengan mudah menulis pendeteksi plagiarisme akademik awk.

GNU awk( gawk) memiliki banyak ekstensi, termasuk array multidimensi sejati dalam versi terbaru. Ada variasi lain awktermasuk mawkdan nawk.

Kedua program menggunakan ekspresi reguler untuk memilih dan memproses teks.

Saya akan cenderung menggunakan di sedmana ada pola dalam teks. Misalnya, Anda dapat mengganti semua angka negatif dalam beberapa teks yang berada dalam bentuk "tanda minus diikuti dengan urutan angka" (mis. "-231,45") dengan formulir "tanda kurung akuntan" (mis. "(231.45)" ) menggunakan ini (yang memiliki ruang untuk perbaikan):

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

Saya akan menggunakan awkketika teks lebih mirip baris dan kolom atau, sebagaimana awkmerujuk pada mereka "catatan" dan "bidang". Jika saya akan melakukan operasi yang sama seperti di atas, tetapi hanya pada bidang ketiga dalam file dibatasi koma sederhana saya mungkin melakukan sesuatu seperti:

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

Tentu saja itu hanya contoh sederhana yang tidak menggambarkan berbagai kemampuan yang ditawarkan masing-masing.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
7
Untuk melihat beberapa contoh mendorong batas sed: sed.sourceforge.net/#script
Dijeda hingga pemberitahuan lebih lanjut.
@ DennisWilliamson - Apakah saya dirugikan jika saya hanya belajar awk? Apakah awk jauh lebih umum digunakan daripada sed?
Steam
4
@blasto: Rekomendasi saya adalah mempelajari keduanya tetapi lebih menekankan pada awk. Banyak hal ekspresi reguler berlaku untuk keduanya (dan alat serta bahasa lain). Gunakan sed untuk hal-hal yang lebih sederhana dan cobalah untuk menghindari hal-hal yang rumit. Sangat keren bahwa Anda dapat melakukan loop dan cabang dalam sed, tetapi baris perintah yang dihasilkan kompleks dan sulit dibaca. Jawaban atas pertanyaan Anda sangat tergantung pada apa yang Anda lakukan.
Dijeda sampai pemberitahuan lebih lanjut.
@DennisWilliamson - Apa yang paling berguna bagi pengembang ETL? ETL atau Extract Transform and Load adalah istilah penyimpanan data. Secara kasar, pekerjaan tersebut melibatkan EKSTRAKSI data dari berbagai sumber berbeda (seperti DB, file excel, file csv dll), TRANSFORMASI yang sama dan kemudian MEMUAT ke dalam gudang data (DW) untuk analisis, menemukan pola dalam data, atau hanya historis. catatan. misalnya. Penggunaan akhir DW - Algoritma yang diterapkan pada DW toko bahan makanan yang memiliki data dari 10 tahun terakhir mungkin mengungkapkan bahwa orang yang cenderung membeli apel juga membeli jeruk atau yang serupa.
Steam
1
Hanya FYI untuk siapa saja yang menemukan ini di mac, coba "sed -E's / - ([0-9] +. [0-9] *) / (\ 1) / g '" untuk contoh sed pertama
Daniel Schmidt
124

1) Apa perbedaan antara awk dan sed?

Keduanya adalah alat yang mengubah teks. TETAPI awk dapat melakukan lebih banyak hal selain hanya memanipulasi teks. Ini adalah bahasa pemrograman dengan sendirinya dengan sebagian besar hal yang Anda pelajari dalam pemrograman, seperti array, loop, jika / selain kontrol aliran dll. Anda dapat "memprogram" juga, tetapi Anda tidak ingin mempertahankan kode yang tertulis di dalamnya .

2) Apa jenis aplikasi kasus penggunaan terbaik untuk sed dan alat awk?

Kesimpulan: Gunakan sed untuk parsing teks yang sangat sederhana. Lebih dari itu, awk lebih baik. Bahkan, Anda bisa membuang semuanya dan hanya menggunakan awk. Karena fungsinya tumpang tindih dan awk dapat melakukan lebih banyak, gunakan saja awk. Anda akan mengurangi kurva belajar Anda juga.

ghostdog74
sumber
7
Poin yang bagus tentang kurva belajar .. terlalu banyak alat yang dapat digabungkan .. jadi saya lebih suka belajar grep dan awk saja .. mari kita lupakan sed :)
Outlier
174
^^ Cukup sed. (maaf, saya harus)
Greg M. Krsak
8
Saya menemukan sed jauh lebih mudah untuk dipelajari, jadi Anda perlu menjelaskannya. Ketika Anda belajar menguasai awk, mungkin berguna untuk dengan cepat belajar dan dapat menggunakannya lebih cepat untuk hal-hal yang Anda mungkin belum tahu bagaimana melakukannya dalam awk.
Didier A.
1
@GregKrsak Anda membuat hari saya. (maaf, saya harus)
Abel Callejo
15
Jangan parit sed, 's/search/replace'jauh lebih mudah untuk mengetik daripada awksintaks dan itulah yang paling Anda butuhkan.
sjas
55

Kedua alat dimaksudkan untuk bekerja dengan teks dan ada tugas kedua alat dapat digunakan untuk.

Bagi saya aturan untuk memisahkannya adalah: Gunakan seduntuk mengotomatiskan tugas yang akan Anda lakukan sebaliknya dalam editor teks secara manual. Itu sebabnya disebut stream editor . (Anda dapat menggunakan perintah yang sama untuk mengedit teks dalam vim). Gunakan awkjika Anda ingin menganalisis teks, artinya bidang penghitungan, menghitung total, mengekstraksi, dan menyusun kembali struktur, dll.

Anda juga jangan lupa grep. Gunakan grepjika Anda hanya ingin mencari / mengekstrak sesuatu dalam teks (file)

hek2mgl
sumber