Saya dulu comm
membandingkan dua file yang diurutkan. Setiap baris dalam file ini adalah bilangan bulat positif. Tetapi hasilnya menunjukkan
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
Kenapa kesalahan bahkan jika dua file ini diurutkan?
sort
comm
numeric-data
wenzi
sumber
sumber
Jawaban:
comm
membutuhkan pengurutan leksikografis (polossort
), bukan pengurutan numerik (sort -n
). Misalnya, ia menginginkan urutan berikut:Bukan pesanan berikut:
Perbaiki ini dan masalahnya harus hilang. Untuk kasus yang lebih esoteris di mana
comm
lokal mungkin berbeda darisort
lokal, Anda mungkin ingin menjalankansort
dancomm
denganLC_COLLATE=C
di lingkungan mereka menggunakan urutan byte asli.sumber
sort -n
sort
dengan , dan tanpa yang-n
saklar dan menunjukkan hanya dengan satu-n
switch dapat Anda mencapai yang benar meningkat agar Anda mengakui diperlukan dalam jawaban Anda sendiri.comm
secara harfiah membutuhkanLC_COLLATE
pemesanan. Cukuplah untuk mengatakan bahwa kesalahan dalam jawaban Anda tidak murni kosmetik untuk contoh di luar set tes Anda ... tidak ada yang meminta jenis numerik positif.JAWABAN TERBARU:
MASALAH:
OP menerima kesalahan tentang " file tidak dalam urutan " ketika menggunakan
comm
untuk membandingkan bilangan bulat positif dalam file, bukan teks. Jadi kita berhadapan dengan angka non-desimal.Jawaban singkat:
Bergantung pada penggunaan
-n
sakelar dengansort
perintah yang digunakan untuk mengurutkan hasil yang disediakancomm
, urutan hasil yang dikembalikan olehcomm
bisa sangat berbeda:Lexographic : Penggunaan
-n
switch dengan sort akan menghasilkan "bilangan bulat positif" yang dipesan dalam serangkaian angka yang meningkat. " Kesalahan " dapat ditekan menggunakancomm
sakelar `s--nocheck-order
Byte Order : TIDAK ada gunanya
-n switch
dengansort
.LC_COLLATE
menentukan pemesanan yang bahkan dapat bervariasi dengan bagaimanalocale
diatur pada host tempat perintah dieksekusi. Ini adalah input yangcomm
diharapkan secara default. Sedikit lebih banyak tentangLC_COLLATE
dapat ditemukan di sini: Reference1 dan Reference2Apakah kesalahan itu masalah? Itu tergantung pada apa yang ingin Anda capai. Seperti yang akan Anda lihat dalam contoh di bawah ini,
comm
mengembalikan hasil yang sama setelah membandingkan file dengan atau tanpa sakelarsort
`s-n
, meskipun pemesanan mereka akan bervariasi dengan cara di atas tergantung pada apakah-n switch
digunakan dengansort
perintah. Saya sendiri, saya lebih suka "lexographic" hasil yang terurut- angka yang meningkat dalam serangkaian.Namun jika Anda tidak menginginkan hasil dalam urutan " leksografis ", maka JANGAN gunakan
-n
sakelar saat menyortir data yang disediakancomm
untuk perbandingan.PENGUJIAN:
Kami akan membandingkan hasil
comm
perintah dengan dan tanpa,-n
sakelar. Saya telah meningkatkan kompleksitas set data uji spesimen saya sesuai permintaan Kusalananda:Data uji :
file1.txt :
file2.txt :
Persimpangan :
Daftar hanya angka-angka yang umum untuk KEDUA file
Tanpa
-n
beralih:Hasil : Benar, tetapi dikembalikan dalam urutan yang tidak disortir
DENGAN
-n
Switch:Hasil : Benar, tetapi dikembalikan dalam urutan LEXOGRAPHIC . Operasi selesai dengan sukses dan mengembalikan hasil yang sama seperti menggunakan
comm
tanpa-n
saklar, tetapi dalam daftar yang diurutkan.Perbedaan :
Daftar hanya angka unik untuk setiap file:
Tanpa
-n
beralih:Hasil : Benar - angka-angka ini memang eksklusif untuk setiap file masing-masing.
DENGAN
-n
Switch:Hasil : Benar, hasil yang sama seperti
comm
tanpa-n
saklar, tetapi mengembalikan kesalahan tentang urutan bilangan bulat positif yang tidak diurutkan dalam file itu sendiri.SOLUSI untuk HASIL LEXOGRAPHIC:
Gunakan sakelar
comm
`s--nocheck-order
untuk menekan pesan kesalahan. Karena kita tahu angkanya tidak diurutkan dalam setiap file tetapi hasilnya dikembalikan dengancomm -n
benar kesalahan dapat diabaikan dengan aman dengan menekannya:Persimpangan :
Perbedaan :
KESIMPULAN:
Kesalahan " file tidak dalam urutan " ketika dikembalikan mengurutkan bilangan bulat positif diumpankan
comm
tidak berarti hasil dikembalikan menggunakan-n
switch dengancomm
yang salah. Memang, menggunakancomm -n
mengembalikan yang benar dengan urutan yang terurut!Terima kasih kepada @dhag, @kusalananda @ChrisDown karena telah mengangkat masalah yang membutuhkan ekspansi lebih lanjut. Selalu senang dengan pekerjaan saya ditinjau: satu-satunya cara kita bisa menjadi lebih baik adalah jika kita terus-menerus didorong dan ditantang oleh rekan-rekan kita.
sumber