0Pricing
DevOps Bootcamp · Pelajaran

Agregasi dengan Array dan Pengelompokan awk

Hitung jumlah, banyaknya data, dan ringkasan berdasarkan kelompok menggunakan array asosiatif yang indeksnya berasal dari nilai field.

Agregasi dengan Array dan Pengelompokan awk adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa Itu Array Asosiatif awk?

Dalam awk, array asosiatif adalah penyimpanan pasangan kunci-nilai, dengan kunci yang dapat berupa string atau angka apa pun. Berbeda dari array berindeks dalam kebanyakan bahasa, array awk pada dasarnya adalah peta hash—sempurna untuk mengelompokkan dan mengagregasikan data berdasarkan nilai field.

  • Dideklarasikan secara implisit: cukup lakukan penetapan arr[key] = value
  • Kunci secara bawaan berupa string (angka dikonversi)
  • Tidak ada batas ukuran—awk memperbesar array sesuai kebutuhan
  • Ideal untuk menghitung jumlah, banyaknya kemunculan, dan rekap per kelompok dalam satu lintasan

Anda tidak perlu menginisialisasi kunci sebelum menaikkan nilainya—awk otomatis memperlakukan kunci yang belum disetel sebagai nol atau string kosong.

Menghitung Baris per Kelompok

Pola agregasi yang paling umum adalah menghitung berapa kali setiap nilai unik dalam sebuah field muncul. Gunakan field $1 (atau field apa pun) sebagai kunci array, lalu naikkan penghitung pada setiap baris yang cocok.

Blok END dijalankan setelah semua input dikonsumsi—di situlah Anda mencetak hasil yang telah dikumpulkan.

count[$1]++

Setelah pemrosesan selesai, count menyimpan jumlah total baris untuk setiap nilai unik dari $1.

#!/usr/bin/env bash
# Count how many log entries exist per HTTP status code
# Input format: <ip> <date> <method> <path> <status> <bytes>
printf '10.0.0.1 2024-01-01 GET /index 200 512
10.0.0.2 2024-01-01 POST /api 404 128
10.0.0.3 2024-01-01 GET /img 200 2048
10.0.0.4 2024-01-01 GET /api 500 64
10.0.0.5 2024-01-01 DELETE /api 404 32
' | awk '
{
    count[$5]++
}
END {
    for (status in count)
        print status, count[status]
}'

Menjumlahkan Field Numerik per Kelompok

Menghitung hanyalah salah satu bentuk agregasi. Untuk menjumlahkan field numerik yang dikelompokkan berdasarkan field lain, akumulasikan nilai numerik ke dalam array yang kuncinya berasal dari field kelompok.

Polanya adalah:

  • Kunci = field pengelompokan (misalnya, $1 untuk nama pengguna)
  • Nilai = total berjalan dari field numerik (misalnya, $2 untuk byte)

Ini menghitung jumlah lengkap per kelompok dalam satu lintasan awk—tanpa memerlukan pengurutan atau prapemrosesan.

#!/usr/bin/env bash
# Sum bytes transferred per user from an access log
printf 'alice 1024
bob 512
alice 2048
charlie 256
bob 768
alice 128
' | awk '
{
    bytes[$1] += $2
}
END {
    for (user in bytes)
        printf "%-10s %d bytes\n", user, bytes[user]
}'

Menggabungkan Hitungan dan Jumlah dalam Satu Lintasan

awk memungkinkan Anda mempertahankan beberapa array secara bersamaan, sehingga Anda memperoleh hitungan dan jumlah (dan karenanya rata-rata) untuk setiap kelompok dalam satu pemindaian file. Ini jauh lebih efisien daripada menjalankan pipeline dua kali.

  • count[key]++—melacak kemunculan
  • total[key] += $N—melacak jumlah berjalan
  • Dalam END, bagi total[k] / count[k] untuk mendapatkan rata-rata per kelompok
#!/usr/bin/env bash
# Compute per-department headcount and average salary
printf 'Engineering Alice 95000
Engineering Bob 88000
Marketing Carol 72000
Marketing Dave 68000
Engineering Eve 102000
Marketing Frank 75000
' | awk '
{
    dept  = $1
    sal   = $3
    count[dept]++
    total[dept] += sal
}
END {
    printf "%-15s %5s %10s\n", "Department", "Count", "Avg Salary"
    for (d in count)
        printf "%-15s %5d %10.0f\n", d, count[d], total[d]/count[d]
}'

Kunci Multi-Field untuk Pengelompokan 2 Dimensi

Anda dapat membuat kunci gabungan dengan menggabungkan beberapa field menggunakan pemisah. Dengan begitu, Anda memperoleh pengelompokan dua dimensi tanpa sintaks khusus.

Pilih pemisah yang tidak mungkin muncul dalam data (misalnya, SUBSEP, pemisah record bawaan awk \034, atau karakter pipa literal |).

  • Kunci gabungan: arr[$1 SUBSEP $2] atau arr[$1"|"$2]
  • Pecah kembali kunci saat mencetak: split(key, parts, "|")
#!/usr/bin/env bash
# Count requests grouped by HTTP method AND status code
printf 'GET 200
POST 201
GET 404
GET 200
DELETE 204
POST 201
GET 404
POST 500
' | awk '
{
    key = $1 "|" $2
    count[key]++
}
END {
    printf "%-8s %-6s %s\n", "Method", "Status", "Count"
    for (k in count) {
        split(k, parts, "|")
        printf "%-8s %-6s %d\n", parts[1], parts[2], count[k]
    }
}'

Melacak Nilai Minimum dan Maksimum per Kelompok

Array asosiatif memudahkan pelacakan nilai min dan max per kelompok. Triknya adalah melakukan inisialisasi hanya pada kemunculan pertama setiap kunci menggunakan kondisi khusus !(key in arr).

  • !(key in min_arr) bernilai true saat pertama kali sebuah kunci ditemukan
  • Setelah inisialisasi, bandingkan dan timpa menggunakan pemeriksaan standar kurang-dari / lebih-dari

Pola ini menghindari nilai nol semu yang dapat merusak nilai minimum Anda.

#!/usr/bin/env bash
# Find min and max response time per endpoint
printf '/api/users 120
/api/orders 340
/api/users 98
/api/orders 512
/api/users 210
/api/orders 280
/health 5
/health 7
' | awk '
{
    ep  = $1
    rt  = $2
    if (!(ep in mn)) { mn[ep] = rt; mx[ep] = rt }
    if (rt < mn[ep]) mn[ep] = rt
    if (rt > mx[ep]) mx[ep] = rt
}
END {
    printf "%-15s %6s %6s\n", "Endpoint", "Min", "Max"
    for (ep in mn)
        printf "%-15s %6d %6d\n", ep, mn[ep], mx[ep]
}'

Distribusi Frekuensi—Kelompok Teratas-N

Tugas yang umum di dunia nyata adalah menemukan nilai yang paling sering muncul sejumlah N teratas. awk menangani penghitungan; teruskan melalui sort dan head untuk memberi peringkat dan mengambil sebagian hasil.

Pola pipeline ini merupakan praktik idiomatis dalam rekayasa shell:

  1. awk menghitung kemunculan ke dalam array, lalu mencetak count key dalam END
  2. sort -rn mengurutkan secara numerik dalam urutan menurun
  3. head -n 5 hanya mempertahankan 5 teratas

Membiarkan awk berfokus pada agregasi dan menyerahkan pengurutan kepada sort mengikuti filosofi Unix.

#!/usr/bin/env bash
# Top 3 most active IP addresses from an access log
printf '192.168.1.10 GET /index
10.0.0.5 POST /api
192.168.1.10 GET /css
172.16.0.3 GET /index
10.0.0.5 GET /api
192.168.1.10 DELETE /api
172.16.0.3 POST /login
10.0.0.5 GET /index
10.0.0.5 POST /logout
' | awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' \
  | sort -rn \
  | head -n 3

Menggunakan NR dan FNR untuk Agregasi Banyak File

Saat memproses banyak file, NR (total record yang telah dibaca) dan FNR (record dalam file saat ini) yang merupakan bawaan awk memungkinkan Anda menandai dari file mana setiap record berasal menggunakan FILENAME.

  • FILENAME—nama file yang sedang dibaca
  • FNR == 1—terpicu di awal setiap file baru (berguna untuk melewati header)

Dengan demikian, Anda dapat melakukan agregasi per file dan per kelompok di seluruh direktori berisi log dalam satu pemanggilan awk.

Mencetak Output Terurut dari Array awk

Perulangan for (key in array) dalam awk tidak menjamin urutan. Untuk output deterministik, teruskan hasil cetak END awk ke sort, atau kumpulkan nilai dan urutkan di dalam awk menggunakan fungsi asorti / asort (hanya GNU awk).

Pendekatan pipeline shell yang portabel biasanya lebih disukai untuk skrip lintas platform:

  • sort -k1,1—mengurutkan berdasarkan field pertama (kunci kelompok) secara alfabetis
  • sort -k2,2rn—mengurutkan berdasarkan field kedua (hitungan/jumlah) secara numerik menurun
#!/usr/bin/env bash
# Bytes per user, sorted alphabetically by username
printf 'zara 800
alice 1500
bob 300
alice 200
zara 400
bob 1100
' | awk '
{
    total[$1] += $2
}
END {
    for (u in total)
        print u, total[u]
}' | sort -k1,1

Menghapus Kunci Array dan Mengosongkan Status

Terkadang Anda perlu mengatur ulang status agregasi di tengah aliran—misalnya saat memproses file log yang setiap bagiannya dipisahkan oleh baris kosong atau nilai penanda.

  • delete arr[key]—menghapus satu entri
  • delete arr—mengosongkan seluruh array (GNU awk)
  • Periksa keberadaan dengan (key in arr) sebelum mengaksesnya untuk menghindari pembuatan entri bayangan

Teknik ini memungkinkan agregasi jendela geser atau per bagian tanpa memulai ulang awk.

#!/usr/bin/env bash
# Sum values within each section delimited by "---"
printf 'alice 100
bob 200
---
alice 50
bob 75
charlie 300
---
' | awk '
/^---/ {
    print "-- Section totals --"
    for (u in total) printf "  %-10s %d\n", u, total[u]
    delete total
    next
}
{
    total[$1] += $2
}'

Pipeline Dunia Nyata: Ringkasan Log Nginx

Menggabungkan semuanya—berikut agregasi satu lintasan awk siap produksi atas format log gabungan Nginx. Agregasi ini menghitung jumlah permintaan, total byte, dan tingkat kesalahan per host virtual dalam satu pemindaian.

Teknik utama yang digunakan:

  • Kunci gabungan: vhost yang diekstrak dari sebuah field
  • Array paralel: reqs[], bytes[], errors[]
  • Akumulasi bersyarat: $9 >= 400 untuk menghitung hanya respons yang mengalami kesalahan
  • Tabel printf berformat dalam END
#!/usr/bin/env bash
# Simulated Nginx combined log: host ip - - [date] "METHOD /path HTTP/1.1" status bytes
printf 'api.example.com 10.0.0.1 - - [01/Jan/2024] "GET /v1" 200 1024
www.example.com 10.0.0.2 - - [01/Jan/2024] "GET /" 200 4096
api.example.com 10.0.0.3 - - [01/Jan/2024] "POST /v1" 500 128
www.example.com 10.0.0.4 - - [01/Jan/2024] "GET /img" 404 64
api.example.com 10.0.0.5 - - [01/Jan/2024] "GET /v1" 200 2048
www.example.com 10.0.0.6 - - [01/Jan/2024] "GET /" 200 4096
api.example.com 10.0.0.7 - - [01/Jan/2024] "DELETE /v1" 403 32
' | awk '
{
    host = $1; status = $9; b = $10
    reqs[host]++
    bytes[host] += b
    if (status + 0 >= 400) errors[host]++
}
END {
    printf "%-20s %6s %10s %6s\n", "Host", "Reqs", "Bytes", "Errors"
    for (h in reqs)
        printf "%-20s %6d %10d %6d\n", h, reqs[h], bytes[h], errors[h]+0
}'

Pemeriksaan Pengetahuan: Menginisialisasi Min dengan Benar

Uji pemahaman Anda tentang kesalahan umum dalam agregasi awk.

Ringkasan Pelajaran: Agregasi dengan Array awk

Anda telah mempelajari pola inti untuk menghitung agregasi per kelompok sepenuhnya di dalam awk:

  • Menghitung: count[$key]++—naikkan pada setiap baris, cetak dalam END
  • Menjumlahkan: total[$key] += $N—akumulasikan field numerik per kelompok
  • Rata-rata: pertahankan count[] dan total[], lalu bagi dalam END
  • Min/Max: isi pada kemunculan pertama menggunakan !(key in arr), lalu bandingkan
  • Kunci gabungan: gabungkan field dengan pemisah untuk pengelompokan multidimensi
  • Output terurut: teruskan hasil cetak END awk ke sort untuk urutan yang deterministik
  • Pengaturan ulang bagian: gunakan delete arr untuk mengosongkan status di antara bagian-bagian logis input

Pola-pola ini memungkinkan Anda menggantikan kueri basis data yang berat atau beberapa lintasan pipeline dengan satu pemanggilan awk yang efisien—keterampilan penting dalam rekayasa shell untuk produksi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Agregasi dengan Array dan Pengelompokan awk” gratis?

Ya — teks lengkap “Agregasi dengan Array dan Pengelompokan awk” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Agregasi dengan Array dan Pengelompokan awk”?

Hitung jumlah, banyaknya data, dan ringkasan berdasarkan kelompok menggunakan array asosiatif yang indeksnya berasal dari nilai field. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?

Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Agregasi dengan Array dan Pengelompokan awk” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?

Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Record, Field, dan Pemisah Kustom dalam awk
  2. Pola, Rentang, dan Blok BEGIN/END
  3. Agregasi dengan Array dan Pengelompokan awk
  4. Fungsi awk, Pemformatan printf, dan Pembuatan Laporan
← Kembali ke DevOps Bootcamp