Saya punya dua file _jeter3.txt dan _jeter1.txt
Saya telah memeriksa keduanya diurutkan pada kolom ke-20 menggunakan sort -c
sort -t ' ' -c -k20,20 _jeter3.txt
sort -t ' ' -c -k20,20 _jeter1.txt
#no errors
tetapi ada kesalahan ketika saya ingin join
kedua file itu mengatakan bahwa file kedua tidak diurutkan:
join -t ' ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order
Saya tidak mengerti mengapa.
cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0
UPDATE : menggunakan ' sort -f
' dan join -i
(keduanya tidak sensitif huruf) memperbaiki masalah. Tapi itu tidak menjelaskan masalah awal saya.
UPDATE : versi sortir & gabung:
> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
locale
.Jawaban:
Saya mendapat kesalahan yang sama dengan Ubuntu 11.04, dengan
sort
danjoin
keduanya dalam versi (GNU coreutils) 8.5.Mereka jelas tidak kompatibel. Bahkan
sort
perintahnya tampaknya disadap: tidak ada perbedaan dengan atau tanpa opsi-f
(--ignore-case
). Saat menyortir,aaB
selalu sebelumnyaaBa
. Karakter non alfanumerik tampaknya juga selalu diabaikan (abc
sebelumnyaab-x
)Bergabung sepertinya mengharapkan yang sebaliknya ... Tapi saya punya solusi
Bahkan, ini terkait dengan urutan pemeriksaan: menggunakan
LANG=en_EN sort -k 1,1 <myfile> ...
kemudianLANG=en_EN join ...
menghilangkan pesan.Internasionalisasi adalah akar kejahatan ... (tidak ada yang mendokumentasikannya dengan jelas).
sumber
LANG=en_EN
, maka itu pasti akan berhasil? Apakah akan berfungsi untuk lokal apa pun, asalkan keduanya menggunakan lokal yang sama? Bisakah kita mengatakan bahwa perbedaan antarasort
danjoin
apakah mereka menggunakan lokal yang berbeda secara default?-k
opsi jawabannya di sini, atau apakah ituLANG=en_EN
? Tidak jelas apa solusi tepatnya di sini.Apakah Anda menyortir dengan angka? Saya menemukan bahwa tanpa mengisi kolom yang saya ikuti menyelesaikan masalah ini untuk saya.
sumber
Jika Anda yakin telah mengurutkan file input dengan benar dan jalurnya dapat dipasangkan, Anda dapat menghindari kesalahan di atas dengan menjalankan
join --nocheck-order file1.txt file2.txt
sumber
sort
secara default menggunakan seluruh baris sebagai kuncinyajoin
hanya menggunakan bidang yang ditentukan sebagai kunci.Anda harus memperbaiki ketidakcocokan ini dengan membatasi pengurutan untuk hanya menggunakan kunci yang ingin Anda ikuti.
Halaman gabung menyatakan:
sumber
Ini akan menyelesaikan masalah Anda. Masalahnya, sebagaimana ditunjukkan oleh @Michael, adalah urutan collation, yang tergantung pada pengaturan LOCALE Anda.
sumber
Perhatikan bahwa jika Anda melihat kesalahan ini, dan Anda telah mengurutkan pada kolom tertentu dan memukul kepala Anda ke tembok mis. Sort -k4,4 maka Anda juga mungkin perlu mengatur pemisah untuk perintah sortir
Rupanya OP sudah melakukan ini dengan -t '' tetapi untuk teks yang dipisahkan tab normal saya akan merekomendasikan
Perintah sortir dapat memasukkan spasi sebagai pemisah secara default, bahkan pada sesuatu yang tampak seperti file tab terpisah (terutama jika ada spasi di dalam kolom yang Anda sortir).
Kemudian jika Anda melewatkan data yang diurutkan untuk bergabung, dan Anda miliki
Kemudian ini akhirnya menyebabkan pesan kesalahan tentang itu tidak disortir. Seperti disebutkan di atas, bergabung mungkin tidak menerima -t ''.
sumber
Untuk bergabung dengan argumen setelah -t adalah karakter. Untuk pengurutan, Anda dapat menyediakan pemisah pengurutan yang lebih panjang. Saya pikir Anda mungkin bergabung dengan file pada bidang berbeda yang Anda inginkan, dan mengabaikan kasus ini menyelesaikan masalah secara kebetulan.
Dan saya setuju dengan Gilles, bahwa sampel data akan sangat membantu.
sumber