Data hasil filter grep atau laporan awk jarang langsung siap dibaca: barisnya belum urut, ada duplikat, dan sering kali kita hanya butuh satu kolom darinya. Tiga perintah kecil menyelesaikan tahap akhir itu — sort mengurutkan baris, uniq merangkum duplikat, dan cut mengambil kolom. Pada chapter ini kita akan berlatih ketiganya pada file data kecil, membedah urutan huruf lawan urutan angka, lalu merangkai pola klasik sort | uniq -c | sort -rn untuk mencari entri paling sering muncul, dan menutup dengan join untuk menggabungkan dua file berdasarkan kunci.
sort: Urutan Huruf vs Urutan Angka #
Tanpa opsi, sort mengurutkan baris secara lexicographic — karakter demi karakter, seperti kamus. Opsi -n mengurutkan menurut nilai angka, dan -r membalik arah urutan:
printf '10\n2\n33\n1\n21\n' > angka.txt
sort angka.txt
sort -n angka.txt
sort -rn angka.txtOutput yang Dihasilkan:
1
10
2
21
33
1
2
10
21
33
33
21
10
2
1Perhatikan urutan pertama: 1, 10, 2, 21, 33 — 10 mendahului 2 karena karakter 1 memang lebih dulu daripada 2 di tabel karakter, bukan karena nilainya lebih kecil. Begitu -n aktif, sort membaca seluruh angka dan urutannya jadi 1, 2, 10, 21, 33; tambahan -r membaliknya menjadi menurun. Jebakan urutan huruf ini paling sering menyergap saat mengurutkan kolom angka dari ls, du, atau laporan.
Mengurutkan Berdasarkan Kolom dengan -t dan -k #
Data nyata berbentuk kolom, dan kita perlu memilih kolom kuncinya. Opsi -t menentukan delimiter dan -k menentukan posisi kolom — perhatikan bahwa sort memakai -t untuk delimiter, berbeda dengan cut yang memakai -d:
printf 'budi:jakarta:25\nsiti:bandung:31\nandi:surabaya:28\nrini:jakarta:22\njoko:medan:35\n' > data.txt
sort -t: -k3,3 -n data.txt
sort -t: -k2,2 data.txtOutput yang Dihasilkan:
rini:jakarta:22
budi:jakarta:25
andi:surabaya:28
siti:bandung:31
joko:medan:35
siti:bandung:31
budi:jakarta:25
rini:jakarta:22
joko:medan:35
andi:surabaya:28Mari kita bedah baris per barisnya:
- Baris 1: membuat fixture lima baris berformat
nama:kota:umur. - Baris 2 (
sort -t: -k3,3 -n):-t:memecah baris pada tanda:,-k3,3berarti “urutkan hanya dengan kolom ke-3” (dari kolom 3 sampai kolom 3), dan-nmemastikan umur dibandingkan sebagai angka — hasilnya rapi dari umur 22 sampai 35. - Baris 3 (
sort -t: -k2,2): mengurutkan menurut kolom kota. Dua barisjakarta(budi dan rini) diurutkan lebih lanjut dengan isi baris utuhnya, sehinggabudimendahuluirini.
Penulisan 3,3 tampak mubazir, tetapi tanpa koma kedua, -k3 berarti “kolom 3 sampai akhir baris” — perilaku berbeda saat kolomnya bertanda spasi.
uniq dan Pola Klasik sort | uniq -c #
Perintah uniq merangkum baris-baris sama yang bersebelahan: -c menambah jumlah kemunculan dan -d hanya menampilkan baris yang duplikat. Karena syaratnya bersebelahan, uniq hampir selalu dipasangkan dengan sort:
printf 'apel\njeruk\napel\nmangga\njeruk\napel\n' > buah.txt
sort -u buah.txt
printf 'error\ninfo\nerror\nerror\ninfo\nwarning\n' > akses.log
uniq -c akses.log
sort akses.log | uniq -c
sort akses.log | uniq -c | sort -rn
sort akses.log | uniq -dOutput yang Dihasilkan:
apel
jeruk
mangga
1 error
1 info
2 error
1 info
1 warning
3 error
2 info
1 warning
3 error
2 info
1 warning
error
infoBaris sort -u membuang duplikat sekaligus mengurutkan — cara satu langkah untuk daftar unik. Baris uniq -c akses.log memperlihatkan bahayanya input tak berurut: error terhitung dua kelompok (1 dan 3) karena uniq hanya melihat tetangganya. Setelah sort didepannya, hitungan jadi benar: 4 error, 2 info, 1 warning. Rangkaian sort | uniq -c | sort -rn adalah pola klasik untuk jawaban “entri mana yang paling sering muncul” pada log apa pun, dan pola pipa ini sendiri sudah kita bahas di chapter Pipes dan Redirection
.
cut dan join untuk Kolom #
Perintah cut mengambil bagian dari setiap baris: opsi -d menentukan delimiter dan -f memilih nomor field, sedangkan -c memotong berdasarkan posisi karakter. Adiknya, join, menggabungkan dua file berdasarkan kolom kunci yang sama — dengan syarat kedua file sudah terurut menurut kunci itu:
printf 'budi:jakarta:25\nsiti:bandung:31\nandi:surabaya:28\n' > data.txt
cut -d: -f1 data.txt
cut -d: -f1,3 data.txt
cut -c1-4 data.txt
printf '101:apel\n102:jeruk\n' > barang.txt
printf '101:15000\n102:8000\n' > harga.txt
join -t: barang.txt harga.txtOutput yang Dihasilkan:
budi
siti
andi
budi:25
siti:31
andi:28
budi
siti
andi
101:apel:15000
102:jeruk:8000Perintah cut -d: -f1 mengambil kolom nama saja; -f1,3 mengambil dua kolom sekaligus dan tetap memakai : sebagai pemisah keluaran. Perintah cut -c1-4 memotong empat karakter pertama tanpa peduli delimiter — cocok untuk data berposisi tetap. Terakhir, join -t: barang.txt harga.txt menyandingkan baris yang kolom pertamanya sama: barang 101 mendapat harga 15000 dan barang 102 mendapat 8000; baris tanpa pasangan (103 yang tidak ada di harga.txt) otomatis digugurkan.
Dengan trio ini, alur pengolahan teks kita lengkap: cari dengan grep, olah dengan sed dan awk, lalu urutkan dan bentuk dengan sort, uniq, cut. Dua utilitas kecil yang tersisa di section ini justru paling sering dipakai sehari-hari — head dan tail, materi chapter berikutnya. Detail lengkap tiap perintah tersedia di halaman manual sort(1)
, cut(1)
, dan join(1)
.