awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
- The
-F
bendera menetapkan pemisah lapangan; Saya menuliskannya dalam tanda kutip tunggal karena ini adalah karakter shell khusus.
- Kemudian
$1 ~ /smiths/
menerapkan {code block} berikut ini hanya untuk baris di mana bidang pertama cocok dengan regex /smiths/
.
- Sisanya sama dengan kode Anda.
Perhatikan bahwa karena Anda tidak benar-benar menggunakan regex di sini, hanya nilai tertentu, Anda dapat dengan mudah menggunakan:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Yang memeriksa kesetaraan string. Ini sama dengan menggunakan regex /^smiths$/
, seperti yang disebutkan dalam jawaban lain, yang mencakup ^
jangkar untuk hanya cocok dengan awal string (awal bidang 1) dan $
jangkar untuk hanya cocok dengan ujung string. Tidak yakin seberapa akrab Anda dengan regex. Mereka sangat kuat, tetapi untuk kasus ini Anda dapat menggunakan pemeriksaan kesetaraan string dengan mudah.
unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
Pendekatan lain adalah dengan menggunakan array asosiatif awk, info lebih lanjut di sini . Baris ini menghasilkan output yang diinginkan:
Sebagai efek samping, array menyimpan semua nilai lain:
Keluaran:
sumber
Sangat bagus sejauh ini. Yang perlu Anda lakukan adalah menambahkan pemilih sebelum blok untuk menambahkan jumlahnya. Di sini kami memeriksa bahwa argumen pertama hanya berisi "pandai besi":
Anda bisa mempersingkat ini sedikit dengan menetapkan pemisah bidang sebagai opsi. Pada
awk
umumnya ide yang bagus untuk menginisialisasi variabel pada baris perintah:sumber
-F
pilihan untuk menentukan pemisah.$NF
adalah untuk "kolom terakhir".sumber
cat
dangrep
tidak perlu di sini./smiths/{...}
jika panggilan grep tidak ada. Ini adalah modifikasi sepele, tetapi memberikan manfaat yang signifikan: mengurangi jumlah proses yang berjalan, menyederhanakan kontrol kesalahan, dan membuat kode lebih jelas.Saya pribadi lebih suka menjaga
awk
bagian sesederhana mungkin dan melakukan sebanyak yang Anda bisa tanpanya. Comingled logic tidak mengambil keuntungan dari kekuatan jaringan pipa Unix dan karenanya lebih sulit untuk memahami, men-debug atau memodifikasi untuk kasus penggunaan yang terkait erat.sumber