Perintah comm Linux: bandingkan baris dua berkas terurut
Perintah comm membandingkan dua berkas yang sudah diurutkan, baris demi baris. Hasil bawaannya mempunyai tiga kolom: baris khusus masukan pertama, baris khusus masukan kedua, dan baris yang sama pada kedua masukan. Gunakan -1, -2, atau -3 untuk menyembunyikan kolom yang tidak diperlukan.
Comm cocok untuk membandingkan dua daftar terurut, misalnya daftar nama lama dan baru. Jika tujuan Anda melihat bagian teks yang ditambahkan, dihapus, atau diubah beserta posisinya, perintah diff biasanya lebih sesuai. Comm membandingkan seluruh baris, bukan mencocokkan satu field kunci di dalam baris.
Sintaks dasar
comm [OPSI]... BERKAS_TERURUT1 BERKAS_TERURUT2
BERKAS_TERURUT1 dan BERKAS_TERURUT2 adalah penanda nama dua berkas masukan. Hasil ditulis ke keluaran standar, biasanya terminal. Kedua berkas perlu diurutkan dengan aturan perbandingan yang sama dengan comm; sekadar memberi nama berakhiran .sorted tidak membuktikan bahwa urutannya benar.
Contoh berikut memakai GNU comm. Periksa comm --version, comm --help, dan man comm untuk opsi pada sistem Anda. Awalan LC_ALL=C di contoh menetapkan locale C hanya untuk perintah terkait, agar sort dan comm menggunakan aturan berbasis bita yang sama. Locale adalah pengaturan lingkungan yang memengaruhi perbandingan karakter.
Siapkan daftar lalu pilih hasil perbandingan
Buat direktori latihan kosong agar berkas contoh tidak menimpa data penting. Siapkan old.txt dengan printf 'banana\napple\n' > old.txt dan new.txt dengan printf 'cherry\nbanana\n' > new.txt. Lalu buat salinan terurut dengan LC_ALL=C sort old.txt > old.sorted dan LC_ALL=C sort new.txt > new.sorted. Pengalihan > mengganti isi tujuan yang sudah ada, sehingga gunakan nama tujuan yang aman.
Lihat tiga jenis baris
LC_ALL=C comm old.sorted new.sorted
Pada data latihan, apple hanya ada di old.sorted, banana ada pada keduanya, dan cherry hanya ada di new.sorted. Dalam keluaran tiga kolom bawaan, apple ditampilkan tanpa tab awal, banana dengan dua tab awal, dan cherry dengan satu tab awal. Urutan baris hasil mengikuti perbandingan terurut, bukan mengumpulkan semua isi kolom pertama dahulu.
Tab dapat tampak sebagai jarak yang berbeda di terminal atau editor. Kategori ditentukan oleh kolomnya, sehingga jangan menebak hanya dari lebar spasi yang terlihat. Saat kolom disembunyikan, pemisah untuk kolom tersebut juga dihilangkan.
Tampilkan hanya baris yang sama
LC_ALL=C comm -12 old.sorted new.sorted
Hasilnya satu baris banana. Opsi -12 berarti menyembunyikan kolom pertama dan kedua, sehingga tersisa kolom ketiga, yaitu baris yang sama pada kedua masukan. Angka pada opsi ini menunjuk kolom keluaran yang disembunyikan, bukan nomor field yang akan dibandingkan.
Tampilkan hanya tambahan pada daftar baru
LC_ALL=C comm -13 old.sorted new.sorted
Hasilnya satu baris cherry. Opsi -13 menyembunyikan kolom pertama dan ketiga, sehingga tersisa baris khusus masukan kedua. Untuk arah sebaliknya, LC_ALL=C comm -23 old.sorted new.sorted menghasilkan apple, yaitu baris khusus daftar lama. Urutan argumen berkas menentukan arti lama dan baru; comm sendiri tidak mengetahui makna nama berkas.
Contoh pendek dengan hasil yang langsung terlihat
Di direktori latihan tadi, blok ini menyiapkan dua berkas lain yang nilai ASCII-nya sudah urut menurut locale C. Jalankan seluruh blok; first.txt dan second.txt akan dibuat atau ditimpa di direktori saat ini:
printf 'apple\nbanana\n' > first.txt
printf 'banana\ncherry\n' > second.txt
LC_ALL=C comm -12 first.txt second.txt
Hasilnya:
banana
Nama first.txt dan second.txt tidak mempunyai makna khusus bagi comm. Blok memakai nilai yang sudah diurutkan agar Anda dapat melihat operasi -12 secara langsung. Untuk masukan nyata yang urutannya belum pasti, buat salinan terurut terlebih dahulu, seperti pada contoh old.txt dan new.txt.
Opsi dan kombinasi kolom
| Opsi | Hasil atau fungsi |
|---|---|
-1 |
Sembunyikan kolom baris khusus masukan pertama. |
-2 |
Sembunyikan kolom baris khusus masukan kedua. |
-3 |
Sembunyikan kolom baris yang sama pada kedua masukan. |
-12 |
Sisakan hanya baris yang sama pada kedua masukan. |
-13 |
Sisakan hanya baris khusus masukan kedua. |
-23 |
Sisakan hanya baris khusus masukan pertama. |
--check-order |
Pada GNU comm, laporkan kegagalan jika urutan masukan tidak sesuai. |
Untuk memeriksa urutan sambil mengambil baris yang sama, gunakan LC_ALL=C comm --check-order -12 old.sorted new.sorted. Pemeriksaan ini berguna pada skrip karena comm dapat sudah menulis sebagian hasil sebelum menemukan kesalahan. Jangan gunakan keluaran dari proses yang gagal sebagai perbandingan lengkap.
Hal yang perlu diperhatikan
Samakan locale pada sort dan comm
Penetapan LC_ALL=C pada sort tidak otomatis mengubah lingkungan perintah comm berikutnya. Karena itu, contoh memberi awalan yang sama pada keduanya. Untuk data yang memerlukan aturan bahasa tertentu, pilih locale yang sesuai dan pakai secara konsisten. Urutan berbasis bita dalam locale C bukan aturan pengurutan alami untuk semua bahasa.
Sortir seluruh baris menurut aturan yang cocok untuk comm. Jangan memakai pengurutan angka -n atau kunci field tertentu lalu menganggap hasilnya pasti cocok dengan perbandingan seluruh baris oleh comm. Panduan sort menjelaskan perbedaan pengurutan teks, angka, dan field.
Tentukan apakah duplikasi perlu dipertahankan
Comm tidak otomatis mengubah masukan menjadi himpunan nilai unik. Jika masukan pertama mempunyai dua baris apple dan masukan kedua satu baris apple, satu salinan dapat masuk hasil bersama dan salinan tambahan masuk hasil khusus masukan pertama. Jadi nilai apple dapat terlihat di dua kategori karena jumlah kemunculannya berbeda.
Jika yang ingin dibandingkan hanya keberadaan setiap nilai, buat salinan unik terurut: LC_ALL=C sort -u old.txt > old.unique dan LC_ALL=C sort -u new.txt > new.unique. Lalu LC_ALL=C comm -12 old.unique new.unique menampilkan nilai yang ada pada kedua daftar. Jika jumlah duplikasi penting, pertahankan data tersebut dan jangan menyebut hasilnya perbandingan himpunan unik.
Kode keluar nol tidak berarti berkas identik
GNU comm selesai dengan kode keluar 0 ketika perbandingan berhasil, walaupun ada baris yang berbeda. Kesalahan, termasuk urutan yang dinyatakan salah, menghasilkan kode bukan nol. Untuk menentukan apakah ada perbedaan, periksa keluaran yang relevan, misalnya hasil -3 yang menyisakan kedua kategori khusus, sambil tetap memeriksa keberhasilan perintah.
Simpan hasil ke berkas berbeda
Gunakan LC_ALL=C comm --check-order -13 old.sorted new.sorted > added.txt untuk menyimpan tambahan dari daftar baru. Periksa status perintah dan isi added.txt sebelum memakainya. Jangan mengalihkan keluaran ke salah satu masukan, karena shell dapat mengosongkannya sebelum comm membaca data. Pengalihan > juga menimpa berkas tujuan lama.
FAQ
Apa arti tiga kolom hasil comm?
Kolom pertama memuat baris khusus masukan pertama, kolom kedua baris khusus masukan kedua, dan kolom ketiga baris yang sama pada kedua masukan. Opsi -1, -2, dan -3 menyembunyikan kolom bernomor tersebut beserta pemisahnya.
Dokumentasi
Definisi opsi dan aturan locale tersedia pada manual GNU comm yang ditayangkan di man7. Pembahasan kode keluar dan pemeriksaan urutan terdapat dalam sumber manual GNU Coreutils 9.11, bagian comm invocation.




