comm: file tidak dalam urutan


9

Saya dulu commmembandingkan 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?


Dalam kasus saya, saya telah mengurutkan (lexicographic ascending) file menggunakan notepad ++, yang mempertimbangkan huruf kecil, dan huruf besar terpisah misalnya. a akan muncul setelah 'Z' dalam jenis menaik. Ini berbeda dari bagaimana menyortir utilitas (bash). Untuk memverifikasi ini saya mengkonversi semua baris ke huruf besar, dan kemudian diurutkan dalam np ++, comm tidak lagi mengeluh.
Sahil Singh

Jawaban:


10

commmembutuhkan pengurutan leksikografis (polos sort), bukan pengurutan numerik ( sort -n). Misalnya, ia menginginkan urutan berikut:

1
2000
300

Bukan pesanan berikut:

1
300
2000

Perbaiki ini dan masalahnya harus hilang. Untuk kasus yang lebih esoteris di mana commlokal mungkin berbeda dari sortlokal, Anda mungkin ingin menjalankan sortdan commdengan LC_COLLATE=Cdi lingkungan mereka menggunakan urutan byte asli.


bagaimana membuatnya melakukan pengurutan numerik?
wenzi


" Lexographic Ordering " adalah tempat serangkaian angka MENINGKATKAN dalam seeries yang dipesan - Anda mendapatkannya mundur dalam jawaban Anda: mathworld.wolfram.com/LexicographicOrder.html . Silahkan lihat hasil tes di bawah jawaban saya yang membandingkan penggunaan sort dengan , dan tanpa yang -nsaklar dan menunjukkan hanya dengan satu -nswitch dapat Anda mencapai yang benar meningkat agar Anda mengakui diperlukan dalam jawaban Anda sendiri.
F1Linux

@ F1Linux Apa? commsecara harfiah membutuhkan LC_COLLATEpemesanan. 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.
Chris Down

@ChrisDown Jawaban Anda yang saya jawab - bukan yang saya lihat Anda baru saja diedit dan SEKARANG menyebutkan " LC_COLLATE " adalah: " comm ingin jenis literallexicographic, bukan jenis numerik. Perbaiki ini dan masalahnya harus hilang. " Sekarang di mana di sana ada sesuatu tentang "LC_COLLATE" yang merupakan binatang yang sangat berbeda dari jenis "_Lexographic". Memang, jawaban awal Anda sangat jarang hanya pada satu baris tanpa NO CONTOH itulah yang mendorong saya untuk meninjau kembali pertanyaan dengan jawaban saya sendiri. Saya memperbarui jawaban Anda yang diperbarui karena "LC_COLLATE" pasti berfungsi di sini seperti yang Anda catat.
F1Linux

0

JAWABAN TERBARU:

MASALAH:

OP menerima kesalahan tentang " file tidak dalam urutan " ketika menggunakan communtuk membandingkan bilangan bulat positif dalam file, bukan teks. Jadi kita berhadapan dengan angka non-desimal.

Jawaban singkat:

Bergantung pada penggunaan -nsakelar dengan sortperintah yang digunakan untuk mengurutkan hasil yang disediakan comm, urutan hasil yang dikembalikan oleh commbisa sangat berbeda:

Lexographic : Penggunaan -nswitch dengan sort akan menghasilkan "bilangan bulat positif" yang dipesan dalam serangkaian angka yang meningkat. " Kesalahan " dapat ditekan menggunakan commsakelar `s--nocheck-order

Byte Order : TIDAK ada gunanya -n switchdengan sort. LC_COLLATEmenentukan pemesanan yang bahkan dapat bervariasi dengan bagaimana localediatur pada host tempat perintah dieksekusi. Ini adalah input yang commdiharapkan secara default. Sedikit lebih banyak tentang LC_COLLATEdapat ditemukan di sini: Reference1 dan Reference2

Apakah kesalahan itu masalah? Itu tergantung pada apa yang ingin Anda capai. Seperti yang akan Anda lihat dalam contoh di bawah ini,commmengembalikan 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 switchdigunakan dengansortperintah. 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 -nsakelar saat menyortir data yang disediakan communtuk perbandingan.

PENGUJIAN:

Kami akan membandingkan hasil commperintah dengan dan tanpa, -nsakelar. Saya telah meningkatkan kompleksitas set data uji spesimen saya sesuai permintaan Kusalananda:

Data uji :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Persimpangan :

Daftar hanya angka-angka yang umum untuk KEDUA file

Tanpa -nberalih:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Hasil : Benar, tetapi dikembalikan dalam urutan yang tidak disortir

DENGAN -n Switch:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

Hasil : Benar, tetapi dikembalikan dalam urutan LEXOGRAPHIC . Operasi selesai dengan sukses dan mengembalikan hasil yang sama seperti menggunakan commtanpa -nsaklar, tetapi dalam daftar yang diurutkan.

Perbedaan :

Daftar hanya angka unik untuk setiap file:

Tanpa -nberalih:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

Hasil : Benar - angka-angka ini memang eksklusif untuk setiap file masing-masing.

DENGAN -n Switch:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

Hasil : Benar, hasil yang sama seperti commtanpa -nsaklar, tetapi mengembalikan kesalahan tentang urutan bilangan bulat positif yang tidak diurutkan dalam file itu sendiri.

SOLUSI untuk HASIL LEXOGRAPHIC:

Gunakan sakelar comm`s --nocheck-orderuntuk menekan pesan kesalahan. Karena kita tahu angkanya tidak diurutkan dalam setiap file tetapi hasilnya dikembalikan dengan comm -nbenar kesalahan dapat diabaikan dengan aman dengan menekannya:

Persimpangan :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Perbedaan :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

KESIMPULAN:

Kesalahan " file tidak dalam urutan " ketika dikembalikan mengurutkan bilangan bulat positif diumpankan commtidak berarti hasil dikembalikan menggunakan -nswitch dengan commyang salah. Memang, menggunakan comm -nmengembalikan 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.


Jawaban terpilih menyebutkan bahwa "comm ingin jenis leksikografis", namun Anda tampaknya mengurutkan secara numerik. Sepertinya akan jatuh dalam beberapa kasus.
Dhag

Tes lagi dengan angka yang mengurutkan secara numerik dan leksikografis yang berbeda, seperti 1000, 200, 30, 4.
Kusalananda

@ Kusalananda Baru saja memasukkan umpan balik Anda yang sangat baik & bermanfaat dalam jawaban saya yang diperbarui. Paling wajib untuk umpan balik Anda!
F1Linux

@ Dhag baru saja memperbarui jawaban saya untuk memasukkan umpan balik Anda & Kusalanada. Paling wajib bagi kalian meluangkan waktu dan upaya untuk meninjau jawaban saya
F1Linux

1
@JeffSchaller Jawaban yang saya jawab pada awalnya menyebutkan jenis "Lexographic", bukan "LC_COLLATE" seperti pada jawaban Chris yang baru diubah. Saya menanggapi Chris yang benar dan memutakhirkan jawaban yang diperbarui. "Lexographic" & "LC_COLLATE" adalah binatang buas yang berbeda. Terima kasih Jeff-
F1Linux
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.