sort, uniq, wc, dan cut

Perkakas penghitungan: mengurutkan, menghitung nilai unik, menghitung baris, dan memotong kolom.

Daftar isi

Perkakas sort, uniq, wc, dan cut membentuk satu kelompok alat penghitungan teks: sort mengurutkan baris, uniq mengelompokkan baris yang sama, wc menghitung baris, kata, dan byte, sedangkan cut memotong kolom tertentu. Masing-masing dapat bekerja sendiri, tetapi kekuatan sebenarnya muncul ketika keempatnya dirangkai menjadi laporan. Topik ini membahas perilaku masing-masing perintah beserta satu contoh laporan akhir yang merangkai semuanya.

Mengurutkan dengan sort#

Perintah sort mengurutkan setiap baris masukan secara leksikografis, yaitu mengikuti urutan karakter dari kiri ke kanan, kemudian mencetak hasilnya. Contoh berikut memakai pinjaman.txt, berkas catatan peminjaman buku dengan dua kolom yang dipisahkan koma, yaitu nama peminjam dan judul buku.

bash
# menyiapkan folder kerja dan berkas contoh
mkdir -p /tmp/kerja-sort-uniq-wc-cut
cd /tmp/kerja-sort-uniq-wc-cut
printf 'Ali,Fisika\nBudi,Biologi\nCitra,Fisika\nDewi,Sejarah\nAli,Matematika\nEko,Biologi\nCitra,Matematika\nBudi,Fisika\n' > pinjaman.txt
cat pinjaman.txt
text Keluaran
Ali,Fisika
Budi,Biologi
Citra,Fisika
Dewi,Sejarah
Ali,Matematika
Eko,Biologi
Citra,Matematika
Budi,Fisika
bash
cd /tmp/kerja-sort-uniq-wc-cut
# mengurutkan seluruh baris dari kiri ke kanan
sort pinjaman.txt
# mengurutkan berdasarkan kolom kedua
sort -t',' -k2 pinjaman.txt
text Keluaran
Ali,Fisika
Ali,Matematika
Budi,Biologi
Budi,Fisika
Citra,Fisika
Citra,Matematika
Dewi,Sejarah
Eko,Biologi
Budi,Biologi
Eko,Biologi
Ali,Fisika
Budi,Fisika
Citra,Fisika
Ali,Matematika
Citra,Matematika
Dewi,Sejarah

Opsi -t',' menetapkan koma sebagai pemisah kolom, sedangkan -k2 memilih kolom kedua sebagai kunci urutan. Hasil pertama mengurutkan berdasarkan nama, sedangkan hasil kedua mengelompokkan catatan berdasarkan judul buku. Opsi -r membalik urutan menjadi menurun bila dibutuhkan, sedangkan opsi -u mengurutkan sekaligus membuang baris duplikat dalam satu langkah.

Urutan numerik dengan -n#

Urutan leksikografis keliru untuk angka: teks 100 dianggap lebih kecil daripada 9 karena karakter 1 mendahului 9. Opsi -n memerintahkan sort membandingkan kunci secara numerik. Contoh berikut memakai pengunjung.txt yang mencatat jumlah pengunjung perpustakaan selama lima hari.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# menyiapkan berkas jumlah pengunjung
printf 'hari1 9\nhari2 78\nhari3 85\nhari4 100\nhari5 74\n' > pengunjung.txt
# urutan leksikografis: keliru untuk angka
sort -k2 pengunjung.txt
# urutan numerik: sesuai nilai
sort -k2 -n pengunjung.txt
text Keluaran
hari4 100
hari5 74
hari2 78
hari3 85
hari1 9
hari1 9
hari5 74
hari2 78
hari3 85
hari4 100

Keluaran pertama menempatkan hari dengan 100 pengunjung di paling atas karena teksnya diurutkan lebih dahulu, sedangkan keluaran kedua menempatkannya di paling bawah sesuai nilainya. Opsi -n dapat dipasangkan dengan kunci kolom maupun dipakai sendiri pada berkas yang berisi angka per baris. Gabungan -n dan -r, yaitu sort -rn, menghasilkan urutan menurun secara numerik dan sering dipakai untuk menyusun peringkat.

Menghitung nilai unik dengan uniq#

Perintah uniq menggabungkan baris yang berulang, tetapi hanya pada baris yang berdampingan. Perilaku ini adalah sumber kekeliruan paling umum: tanpa pengurutan lebih dahulu, baris yang sama yang tersebar tidak terdeteksi.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# uniq tanpa pengurutan: baris terakhir tidak terdeteksi
printf 'ali\nbudi\nali\n' | uniq
# setelah diurutkan, baris yang sama menjadi berdampingan
printf 'ali\nbudi\nali\n' | sort | uniq
text Keluaran
ali
budi
ali
ali
budi

Opsi -c menambahkan hitungan kemunculan di depan setiap baris unik, dan pasangan sort | uniq -c menjadi pola standar penghitungan. Variannya uniq -d mencetak hanya baris yang berulang sehingga berguna untuk menguji keberadaan duplikat, sedangkan uniq -u mencetak hanya baris yang muncul satu kali.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# menghitung banyaknya kemunculan setiap nama
printf 'ali\nbudi\nali\n' | sort | uniq -c
text Keluaran
      2 ali
      1 budi

Menghitung baris, kata, dan byte dengan wc#

Perintah wc (word count, penghitung kata) melaporkan tiga bilangan sekaligus: banyaknya baris, kata, dan byte. Opsi -l, -w, dan -c memilih satu bilangan saja.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# melaporkan baris, kata, dan byte sekaligus
wc pinjaman.txt
# hanya banyaknya baris
wc -l pinjaman.txt
# hanya banyaknya byte
wc -c pinjaman.txt
text Keluaran
  8   8 106 pinjaman.txt
8 pinjaman.txt
106 pinjaman.txt

Hasilnya delapan baris, delapan kata, dan 106 byte. Jumlah kata sama dengan jumlah baris karena setiap baris berisi satu kata tanpa spasi. Bila beberapa berkas diberikan sekaligus, wc menambahkan satu baris total di akhir keluarannya. Apabila masukannya berupa pipe, wc hanya mencetak angkanya tanpa nama berkas, sehingga bentuk cat pinjaman.txt | wc -l menghasilkan keluaran 8 saja.

Memotong kolom dengan cut#

Perintah cut mengambil sebagian dari setiap baris. Opsi -d menetapkan pemisah kolom dan -f memilih nomor kolom, sedangkan -c memilih rentang karakter.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# mengambil kolom nama
cut -d',' -f1 pinjaman.txt
# mengambil kolom judul
cut -d',' -f2 pinjaman.txt
# mengambil tiga karakter pertama setiap baris
cut -c1-3 pinjaman.txt
text Keluaran
Ali
Budi
Citra
Dewi
Ali
Eko
Citra
Budi
Fisika
Biologi
Fisika
Sejarah
Matematika
Biologi
Matematika
Fisika
Ali
Bud
Cit
Dew
Ali
Eko
Cit
Bud

Opsi -f2 menghasilkan kolom judul yang siap dihitung, sedangkan -c1-3 bekerja pada posisi karakter tanpa memedulikan pemisah. Baris yang tidak memuat pemisah diteruskan apa adanya oleh cut. Perilaku ini kadang menyembunyikan berkas yang formatnya tidak seragam, sehingga opsi -s perlu dipakai untuk menahan baris semacam itu agar hanya baris berpemisah yang dicetak. Selain satu nomor, -f juga menerima rentang seperti -f1-2 maupun beberapa kolom sekaligus seperti -f1,3. Untuk berkas yang pemisahnya tidak tetap, misalnya beberapa spasi berurutan, cut menjadi rapuh, sehingga awk dengan pemrosesan medannya lebih tepat dipakai.

Merangkai menjadi satu laporan#

Keempat perintah tersebut dirangkai dengan pipe menjadi satu laporan, yaitu judul buku yang paling banyak dipinjam beserta hitungannya. Alurnya: cut mengambil kolom judul, sort mengumpulkan judul yang sama agar berdampingan, uniq -c menghitungnya, dan sort -rn mengurutkan hasil hitungan dari yang terbesar.

bash
cd /tmp/kerja-sort-uniq-wc-cut
# laporan buku terpopuler dari berkas pinjaman
cut -d',' -f2 pinjaman.txt | sort | uniq -c | sort -rn
text Keluaran
      3 Fisika
      2 Matematika
      2 Biologi
      1 Sejarah

Satu baris perintah kini menjawab pertanyaan statistik sederhana terhadap berkas data. Setiap tahap pada rangkaian ini persis sama dengan yang dipraktikkan pada bagian-bagian sebelumnya, sehingga rangkaiannya dapat dibaca sebagai ringkasan seluruh topik dalam satu baris. Untuk berkas log yang kolomnya berbeda, hanya argumen cut yang perlu disesuaikan, sedangkan tiga tahap sisanya tetap dipakai apa adanya. Keluaran dengan hitungan terbesar di atas inilah bentuk paling sederhana dari laporan peringkat.

Kesalahan umum#

Kesalahan pertama adalah menjalankan uniq tanpa sort. Baris yang sama yang tidak berdampingan lolos dari penghitungan tanpa peringatan, sehingga hitungan pada laporan kurang dari seharusnya tetapi tidak terlihat salah. Memasangkan keduanya, sort | uniq -c, adalah kebiasaan yang perlu dibiasakan.

Kesalahan kedua adalah melupakan -n ketika kunci berupa angka. Urutan leksikografis menempatkan 100 sebelum 9, dan kekeliruan ini tidak menyebabkan error sehingga mudah lolos ke laporan akhir. Kesalahan ketiga adalah memakai cut -d' ' pada berkas yang spasinya tidak tetap, misalnya kolom yang dipisahkan dua spasi atau lebih. Pemisah tunggal membuat kolom kosong muncul dan nomor kolom bergeser, sedangkan awk yang memperlakukan spasi beruntun sebagai satu pemisah memberikan hasil yang lebih andal.

Ringkasan#

  • sort mengurutkan baris secara leksikografis, dengan -t dan -k untuk memilih kunci kolom, -n untuk urutan numerik, dan -r untuk membalik arah.
  • uniq hanya menganalisis baris yang berdampingan, sehingga selalu didahului sort, dan -c menambahkan hitungan kemunculan.
  • wc melaporkan banyaknya baris, kata, dan byte dengan opsi -l, -w, dan -c, sedangkan cut memotong kolom dengan -d dan -f atau karakter dengan -c.
  • Rangkaian cut | sort | uniq -c | sort -rn membentuk laporan peringkat sederhana dari berkas data apa pun.

Referensi#