Perintah uniq Linux: gabungkan baris dan hitung pengulangan

Perintah uniq menggabungkan baris sama yang bersebelahan, atau menampilkan jumlah kemunculan setiap kelompok baris tersebut. Jika nilai yang sama tersebar di seluruh berkas, urutkan dahulu dengan sort agar nilainya bersebelahan. Uniq sendiri tidak mengurutkan masukan dan tidak menghapus semua duplikasi yang terpisah oleh baris lain.

Gunakan uniq untuk merangkum pengulangan berurutan, misalnya pesan yang sama dalam log. Untuk menghitung frekuensi setiap nama di seluruh berkas, gabungkan sort dan uniq. Pengurutan mengubah urutan data, sehingga jangan menerapkannya begitu saja jika urutan kejadian perlu dipertahankan.

Sintaks dasar

uniq [OPSI]... [BERKAS_MASUKAN [BERKAS_KELUARAN]]

Tanpa berkas masukan, uniq membaca masukan standar, termasuk data dari pipa. Tanpa berkas keluaran, hasil ditulis ke keluaran standar, biasanya terminal. Tanpa opsi, satu kelompok baris bersebelahan yang sama diwakili oleh baris pertamanya. Contoh berikut memakai GNU uniq; periksa uniq --version, uniq --help, dan man uniq untuk implementasi yang tersedia di sistem Anda.

Contoh penggunaan pada berkas

Buat direktori latihan kosong sebelum menyiapkan contoh agar tidak menimpa data penting. Perintah printf pada persiapan memakai pengalihan >, yang mengganti isi berkas tujuan jika nama tersebut sudah ada.

Gabungkan pengulangan yang bersebelahan

Siapkan events.txt dengan printf 'apple\napple\nbanana\napple\n' > events.txt, lalu jalankan:

uniq events.txt

Hasilnya apple, banana, lalu apple, masing-masing pada baris sendiri. Dua apple pertama digabungkan karena bersebelahan. Apple terakhir tetap ada karena dipisahkan oleh banana. Berkas events.txt tidak berubah; perintah ini hanya menampilkan hasil.

Hitung kemunculan di seluruh berkas

Siapkan names.txt dengan printf 'apple\napple\nbanana\napple\n' > names.txt. Untuk mengelompokkan nilai yang sama sebelum menghitungnya, gunakan:

sort names.txt | uniq -c

Dengan data tersebut, hasil berisi 3 apple dan 1 banana pada dua baris. GNU uniq dapat menambahkan spasi di depan angka untuk meratakan kolom hitungan. Angka dari -c menghitung seluruh anggota kelompok, termasuk baris pertama yang dipertahankan, bukan hanya jumlah salinan tambahannya.

Untuk urutan berbasis bita yang konsisten pada contoh sederhana ini, tetapkan locale pada kedua tahap: LC_ALL=C sort names.txt | LC_ALL=C uniq -c. Locale adalah pengaturan lingkungan yang memengaruhi aturan perbandingan karakter. Locale C bukan urutan kamus alami untuk semua bahasa.

Tampilkan nilai yang berulang

sort names.txt | uniq -d

Pada names.txt yang sama, hasilnya satu baris apple. Opsi -d menampilkan satu baris per kelompok yang beranggota dua atau lebih; opsi ini tidak menampilkan semua salinan. Karena sort lebih dahulu mengumpulkan nilai yang sama, contoh tersebut menemukan nilai yang berulang di seluruh berkas.

Mengapa duplikasi yang terpisah tetap muncul?

Contoh berikut mengirim empat baris langsung ke uniq tanpa pengurutan:

printf 'apple\napple\nbanana\napple\n' | uniq -c

Hasilnya seperti berikut; spasi awal sebelum angka tidak ditampilkan di sini:

2 apple
1 banana
1 apple

Kelompok pertama berisi dua apple, kelompok kedua satu banana, dan kelompok ketiga satu apple. Meskipun nilai apple muncul tiga kali, uniq -c tidak menggabungkan kelompok yang tidak bersebelahan. Jika yang diperlukan adalah frekuensi seluruh nilai tanpa mempertahankan urutan asal, gunakan bentuk sort dan uniq -c pada contoh sebelumnya.

Opsi yang sering digunakan

Opsi Fungsi dan batasnya
-c Tambahkan jumlah baris dalam setiap kelompok yang bersebelahan.
-d Tampilkan satu baris per kelompok yang berulang.
-u Tampilkan hanya kelompok yang terdiri dari satu baris.
-i Abaikan perbedaan huruf besar dan kecil saat membandingkan baris bersebelahan.
-f N Lewati N field awal saat membandingkan; field mengikuti aturan spasi atau tab GNU uniq.

Opsi -i dan -f mengubah bagian atau bentuk teks yang dianggap sama, tetapi tetap tidak membuat uniq membandingkan semua baris yang berjauhan. Misalnya, printf 'A\na\nB\n' | LC_ALL=C uniq -i -c menghasilkan kelompok A berjumlah 2 dan kelompok B berjumlah 1. Jika memakai sort untuk mengelompokkan teks tanpa membedakan kapitalisasi, sesuaikan juga pembanding sort, misalnya LC_ALL=C sort -f names.txt | LC_ALL=C uniq -i -c.

Pada data sederhana yang dipisahkan spasi, printf 'id1 apple\nid2 apple\nid3 banana\n' | uniq -f 1 menghasilkan id1 apple dan id3 banana. Field pertama dilewati ketika membandingkan, sehingga dua baris pertama dianggap sama dan baris pertama mewakili kelompok. Gunakan opsi ini hanya jika perbedaan pada field yang dilewati memang boleh diabaikan.

Hal yang perlu diperhatikan

-u tidak berarti satu salinan setiap nilai

uniq -u events.txt menghasilkan banana lalu apple untuk data latihan tadi. Kelompok apple pertama berisi dua baris sehingga tidak ditampilkan, tetapi apple terakhir adalah kelompok satu baris sehingga tetap muncul. Untuk memilih nilai yang muncul tepat sekali di seluruh names.txt, gunakan LC_ALL=C sort names.txt | LC_ALL=C uniq -u; pada contoh ini hasilnya hanya banana.

Jika tujuan Anda menyisakan satu salinan setiap nilai, termasuk nilai yang semula berulang, LC_ALL=C sort -u names.txt menghasilkan apple dan banana. Perbedaan ini penting: sort -u mengurutkan sekaligus menyisakan satu wakil, sedangkan uniq -u menyaring kelompok yang ukurannya satu.

Simpan hasil ke berkas yang berbeda

Untuk menyimpan hasil penggabungan berurutan, gunakan uniq events.txt events-uniq.txt, lalu periksa events-uniq.txt. Gunakan nama tujuan baru jika belum ingin mengganti hasil lama. Jangan gunakan berkas yang sama sebagai masukan dan keluaran, termasuk bentuk uniq events.txt > events.txt, karena pengalihan shell dapat mengosongkan masukan sebelum dibaca. Simpan ke tujuan terpisah dan tinjau hasil sebelum mengganti data penting.

Tentukan urutan dan aturan kesamaan

Menyortir log dapat menghilangkan urutan kronologis yang dibutuhkan untuk analisis kejadian. Untuk menggabungkan pengulangan yang benar-benar berturut-turut, jalankan uniq langsung pada urutan aslinya. Untuk penghitungan global, urutkan salinan atau alirkan hasil sort melalui pipa. Jika harus menghapus duplikasi global sambil mempertahankan urutan kemunculan pertama, uniq saja tidak memenuhi kebutuhan tersebut.

Gunakan aturan perbandingan yang sesuai antara sort dan uniq, terutama ketika memakai locale atau mengabaikan kapitalisasi. Perbedaan spasi, kapitalisasi, dan field yang dipilih dapat menentukan apakah dua baris masuk kelompok yang sama. Panduan perintah sort menjelaskan pengurutan angka, kunci field, dan akibat pemilihan kunci pembanding.

FAQ

Mengapa uniq masih menampilkan nilai yang sama beberapa kali?

Uniq memproses kelompok baris sama yang bersebelahan. Jika ada baris lain di antaranya, nilai tersebut menjadi kelompok baru. Urutkan dahulu jika semua kemunculan nilai perlu digabungkan dan perubahan urutan memang sesuai tujuan Anda.

Dokumentasi

Definisi opsi dan aturan field tersedia dalam manual GNU uniq dari proyek Coreutils, ditayangkan di man7.