Apa perbedaan yang tepat antara awk dan potong dengan grep? [Tutup]

30

Kita tahu bahwa kita bisa mendapatkan kolom kedua dari baris yang kita inginkan dari file menggunakan dua teknik ini:

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

atau

grep WORD filename| cut -f 2 -d ' '

Pertanyaan saya adalah:

  • Apa perbedaan antara kedua perintah di atas?
  • Mana yang memiliki kinerja terbaik?
  • Apa keuntungan menggunakan awklebih dari menggunakan cut, dan sebaliknya?
  • Pilihan apa yang awkmemberi kita ke atas cutdan sebaliknya?
Networker
sumber
adalah bahwa echo filenameatau cat filename?
Avinash Raj
@AvinashRaj diedit maaf
Networker

Jawaban:

35

Perbedaan paling menonjol antara dua baris Anda akan tergantung pada input. cutmengambil satu karakter -dsebagai pembatas bidang (standarnya adalah TAB), dan setiap kemunculan karakter tersebut memulai bidang baru. awkNamun, lebih fleksibel. Pemisah dalam FSvariabel dan dapat berupa string kosong (setiap karakter input membuat bidang terpisah), satu karakter, atau ekspresi reguler. Kasus khusus karakter spasi tunggal (default) berarti untuk membagi pada urutan spasi putih apa pun . Juga, awkmenekan spasi putih terkemuka secara default.

Silakan bandingkan:

$ 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

Di sini, awkterbagi pada urutan ruang antara abcdan defsementara cutmengambil setiap ruang sebagai pemisah.

Apa yang Anda ambil akan tergantung pada apa yang ingin Anda capai. Kalau tidak, saya akan berharap cutuntuk menjadi lebih cepat karena itu adalah alat yang lebih kecil, tujuan tunggal sedangkan awkmemiliki bahasa pemrograman sendiri.

Dubu
sumber
bahwa apa yang saya inginkan sebagai jawaban, terima kasih saya akan menandai pertanyaan sebagai dijawab @Dubu
Networker
1
cutkemungkinan lebih cepat dari Awk saja , tetapi tidak begitu pasti bahwa grep ... | cutakan lebih cepat dari Awk murni.
Wildcard
8

Secara umum, semakin khusus suatu alat, semakin cepat itu. Jadi dalam kebanyakan kasus, Anda bisa berharap cutdan grepmenjadi lebih cepat daripada sed, dan sedlebih cepat daripada awk. Jika Anda mengimbangi pipeline yang lebih panjang dari alat yang lebih sederhana dengan satu permintaan alat yang lebih kompleks, tidak ada aturan praktis. Ini hanya masalah dengan input besar (katakanlah, jutaan baris); untuk input pendek, Anda tidak akan melihat perbedaan.

Keuntungan dari alat yang lebih kompleks tentu saja mereka dapat melakukan lebih banyak hal.

Perintah Anda menggunakan kucing tidak perlu. Gunakan pengalihan saja (terutama jika Anda khawatir tentang kecepatan, meskipun Anda mungkin tidak perlu khawatir tentang kecepatan sampai Anda menjalankan benchmark run).

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

Perintah-perintah ini hampir setara. Perbedaannya adalah:

  • awk dan grep memiliki sintaks regexp yang berbeda . Awk dan grep -Ememiliki sintaks regexp yang hampir sama (ekspresi reguler yang diperluas).
  • cut -d ' 'memperlakukan setiap karakter ruang individu sebagai pembatas. Pembatas default awk adalah setiap urutan spasi putih, yang dapat berupa beberapa spasi, tab, dll. Anda tidak dapat menggunakan urutan spasi putih acak sebagai pemisah dengan cut. Untuk menggunakan ruang individu sebagai pemisah di awk, mengatur pemisah lapangan untuk regexp yang cocok satu ruang, selain regexp yang terdiri dari satu ruang (yang merupakan kasus khusus yang berarti “setiap spasi urutan”, yaitu default): awk -F '[ ]' '/WORD/ {print $2}'.

¹ Aturan Pertama Optimalisasi Program: Jangan lakukan itu. Aturan Kedua tentang Pengoptimalan Program (hanya untuk para ahli!): Jangan lakukan itu dulu. - Michael A. Jackson

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Perintahmu,

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

Anda bahkan tidak memerlukan catperintah. Anda dapat mencoba,

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

Dan perintah di bawah ini mengalihkan output dari kucing ke grep lalu memotong,

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

Kemungkinan besar kita harus menghindari redirection output. Awk melakukan pekerjaan dalam satu baris tetapi cutmembutuhkan grepperintah untuk mendapatkan hanya baris yang berisi kata tertentu dan mencetak kolom 2 sesuai dengan ruang pembatas.

Anda dapat melakukan hal-hal dalam awk jika pemotongan gagal dilakukan.

Avinash Raj
sumber
3
ps Anda tidak perlu perintah kucing untuk grep juga. Anda bisa melakukannya grep WORD filename.
phoops
@ edvinas.me ya.
Avinash Raj