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 dengan sort
perintah yang digunakan untuk mengurutkan hasil yang disediakan comm
, urutan hasil yang dikembalikan oleh comm
bisa sangat berbeda:
Lexographic : Penggunaan -n
switch dengan sort akan menghasilkan "bilangan bulat positif" yang dipesan dalam serangkaian angka yang meningkat. " Kesalahan " dapat ditekan menggunakan comm
sakelar `s--nocheck-order
Byte Order : TIDAK ada gunanya -n switch
dengan sort
. LC_COLLATE
menentukan pemesanan yang bahkan dapat bervariasi dengan bagaimana locale
diatur pada host tempat perintah dieksekusi. Ini adalah input yang comm
diharapkan secara default. Sedikit lebih banyak tentang LC_COLLATE
dapat 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,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 disediakan comm
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 :
40
110000
2200
6
33000
file2.txt :
2200
40
33000
6
440000
Persimpangan :
Daftar hanya angka-angka yang umum untuk KEDUA file
Tanpa -n
beralih:
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 comm
tanpa -n
saklar, tetapi dalam daftar yang diurutkan.
Perbedaan :
Daftar hanya angka unik untuk setiap file:
Tanpa -n
beralih:
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 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 dengan comm -n
benar 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 comm
tidak berarti hasil dikembalikan menggunakan -n
switch dengan comm
yang salah. Memang, menggunakan comm -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.