awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
-F
bendera mengatur pemisah bidang; Saya memasukkannya ke dalam tanda kutip tunggal karena ini adalah karakter shell khusus.- Kemudian
$1 ~ /smiths/
menerapkan {code block} berikut hanya ke baris yang kolom pertamanya 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$/
, sebagaimana disebutkan dalam jawaban lain, yang mencakup ^
jangkar untuk hanya mencocokkan awal string (awal bidang 1) dan $
jangkar hanya cocok dengan ujung string. Tidak yakin seberapa akrab Anda dengan regex. Mereka sangat kuat, tetapi untuk kasus ini Anda dapat menggunakan pemeriksaan persamaan string dengan mudah.
Pendekatan lain adalah dengan menggunakan array asosiatif awk, info lebih lanjut di sini. Baris ini menghasilkan keluaran yang diinginkan:
awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt
Sebagai efek samping, larik menyimpan semua nilai lainnya:
awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt
Keluaran:
smiths 212
denniss 100
olivert 10
Sangat bagus sejauh ini. Yang perlu Anda lakukan hanyalah menambahkan pemilih sebelum blok untuk menambahkan jumlah. Di sini kami memeriksa bahwa argumen pertama hanya berisi "smiths":
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
Anda dapat mempersingkat ini sedikit dengan menentukan pemisah bidang sebagai opsi. Di awk
umumnya merupakan ide bagus untuk menginisialisasi variabel pada baris perintah:
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'