GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan awk untuk menjumlahkan nilai kolom, berdasarkan nilai kolom lain

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}'

Linux
  1. Menggunakan awk untuk mencetak semua kolom dari n ke yang terakhir

  2. Tambahkan Kolom ke akhir file CSV menggunakan 'awk' dalam skrip BASH

  3. Memotong video berdasarkan waktu mulai dan berakhir menggunakan ffmpeg

  1. Menggunakan grep vs awk

  2. Filter file .CSV berdasarkan nilai kolom ke-5 file dan cetak catatan tersebut ke dalam file baru

  3. Bagaimana cara mengganti konten kolom tertentu dengan awk?

  1. Bagaimana Mendapatkan Jumlah Nilai Dalam Kolom Berdasarkan Variabel Di Kolom Lain Secara Terpisah??

  2. Menggunakan –exclude Dengan Perintah Du?

  3. Menggunakan AWK untuk memilih baris dengan nilai tertentu di kolom tertentu