bergabung: "File 2 tidak dalam urutan"


13

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 joinkedua 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.
(...)

Bisakah Anda memberi kami hasil "join --version" dan "sort --version" hanya untuk kelengkapan? Saya tidak dapat bergabung dengan beberapa versi gnu yang lebih lama untuk memberi saya pesan kesalahan dalam keadaan apa pun.
Bruce Ediger

3
Silakan kirim beberapa data sampel yang menunjukkan masalah, dan output dari locale.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


25

Saya mendapat kesalahan yang sama dengan Ubuntu 11.04, dengan sortdan joinkeduanya dalam versi (GNU coreutils) 8.5.

Mereka jelas tidak kompatibel. Bahkan sortperintahnya tampaknya disadap: tidak ada perbedaan dengan atau tanpa opsi -f( --ignore-case). Saat menyortir, aaBselalu sebelumnya aBa. Karakter non alfanumerik tampaknya juga selalu diabaikan ( abcsebelumnya ab-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> ...kemudian LANG=en_EN join ...menghilangkan pesan.

Internasionalisasi adalah akar kejahatan ... (tidak ada yang mendokumentasikannya dengan jelas).


Jadi, jika keduanya digunakan 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 antara sortdan joinapakah mereka menggunakan lokal yang berbeda secara default?
Aaron McDaid

Apakah -kopsi jawabannya di sini, atau apakah itu LANG=en_EN? Tidak jelas apa solusi tepatnya di sini.
Pengguna

5

Apakah Anda menyortir dengan angka? Saya menemukan bahwa tanpa mengisi kolom yang saya ikuti menyelesaikan masalah ini untuk saya.

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

5

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


4

sort secara default menggunakan seluruh baris sebagai kuncinya

join 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:

Penting: FILE1 dan FILE2 harus diurutkan pada kolom gabungan. Misalnya, gunakan 'sort -k 1b, 1' jika> 'join' tidak memiliki opsi. Catatan, perbandingan menghormati aturan yang ditentukan oleh 'LC_COLLATE'. Jika input> tidak diurutkan dan beberapa baris tidak dapat digabungkan, pesan peringatan akan diberikan.


2
LOCALE=C sort ...
LOCALE=C join ...

Ini akan menyelesaikan masalah Anda. Masalahnya, sebagaimana ditunjukkan oleh @Michael, adalah urutan collation, yang tergantung pada pengaturan LOCALE Anda.


2

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

sort -t $'\t' ...

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

join -t $'\t' ...

Kemudian ini akhirnya menyebabkan pesan kesalahan tentang itu tidak disortir. Seperti disebutkan di atas, bergabung mungkin tidak menerima -t ''.


1

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.

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.