join: “Dosya 2 sıralı değil”


13

İki dosyam var _jeter3.txt ve _jeter1.txt

İkisini de kullanarak 20. sütunda sıralandığını kontrol ettim sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

ancak joinher iki dosyaya istediğinizde bir hata var, ikinci dosyanın sıralanmadığını söylüyor:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

Nedenini anlamıyorum.

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

GÜNCELLEME : ' sort -f' ve join -i(her ikisi de büyük / küçük harfe duyarsız) kullanmak sorunu çözer. Ama bu benim ilk sorunumu açıklamıyor.

GÜNCELLEME : sort & join sürümleri:

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

Bize sadece tamlık uğruna "join --version" ve "sort --version" çıktılarını verebilir misiniz? Hiçbir durumda bana bu hata iletisini vermek için gnu katılmak bazı eski sürümleri alamıyorum.
Bruce Ediger

3
Lütfen sorunu ve çıktısını gösteren bazı örnek veriler gönderin locale.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


25

Ubuntu 11.04 ile aynı hatayı aldım sortve joinher ikisi de sürümde (GNU coreutils) 8.5.

Açıkça uyumsuzlar. Aslında sortkomut hata veriyor gibi görünüyor: -f( --ignore-case) seçeneğiyle veya seçeneğiyle hiçbir fark yok . Sıralama yaparken aaB, her zaman daha önce aBa. Alfasayısal olmayan karakterler de her zaman yok sayılır ( abcdaha önce ab-x)

Üyelik tam tersini bekliyor gibi görünüyor ... Ama bir çözümüm var

Aslında bu, harmanlama sırasına bağlıdır: LANG=en_EN sort -k 1,1 <myfile> ...daha sonra kullanmak LANG=en_EN join ...mesajı ortadan kaldırır.

Uluslararasılaşma kötülüğün köküdür ... (kimse bunu açıkça belgelemiyor).


Yani, her ikisi de kullanırsa LANG=en_EN, o zaman kesinlikle işe yarayacak mı? Her ikisi de aynı yerel ayarı kullandığı sürece herhangi bir yerel ayar için işe yarar mı? Biz arasındaki fark söyleyebilir miyiz sortve joinbunlar varsayılan olarak farklı bir yerel ayarı kullanmasıdır?
Aaron McDaid

-kSeçenek burada cevap mı , yoksa değil LANG=en_ENmi? Burada kesin çözümün ne olduğu belli değil.
Kullanıcı

5

Rakamlarla mı sıralama yapıyordunuz? Katıldığım sütunu sıfır doldurmanın bu sorunu benim için çözdüğünü buldum.

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

5

Giriş dosyalarınızı doğru bir şekilde sıraladığınızdan eminseniz ve satırları eşleştirilebiliyorsa, yukarıdaki hatayı önleyerek çalıştırabilirsiniz. join --nocheck-order file1.txt file2.txt


4

sort varsayılan olarak tüm satırı anahtar olarak kullanır

join anahtar olarak yalnızca belirtilen alanı kullanır.

Bu uyumsuzluğu, sıralamayı yalnızca katılmak istediğiniz anahtarı kullanacak şekilde kısıtlayarak düzeltmelisiniz.

Birleştirme sayfasına katılın:

Önemli: FILE1 ve FILE2 birleştirme alanlarında sıralanmalıdır. Örneğin, 'birleştirme' seçeneği yoksa 'sort -k 1b, 1' kullanın. Notlar, karşılaştırmalar 'LC_COLLATE' tarafından belirtilen kurallara uymaktadır. > Girişi sıralanmazsa ve bazı satırlar birleştirilemezse, bir uyarı mesajı verilir.


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

Bu sorununu çözecektir. @Michael tarafından belirtildiği gibi sorun, LOCALE ayarınıza bağlı olan harmanlama sırasıdır.


2

Bu hatayı görüyorsanız ve zaten belirli bir sütunda sıraladıysanız ve başınızı duvara çarptığınıza dikkat edin, örneğin sort -k4,4, ayrıca sort komutu için ayırıcıyı ayarlamanız gerekebilir

Görünüşe göre OP bunu zaten -t ile yaptı '' ama normal sekmeyle ayrılmış metin için tavsiye ederim

sort -t $'\t' ...

Sıralama komutu, sekmeyle ayrılmış dosyaya benzeyen bir şeyde bile boşlukları varsayılan olarak ayırıcılar olarak dahil edebilir (özellikle üzerinde sıraladığınız sütunun içinde boşluklar varsa).

Sonra bu sıralanmış verileri katılmak için geçtiyseniz ve

join -t $'\t' ...

Daha sonra bu, sıralanmamış hata mesajına neden olur. Yukarıda belirtildiği gibi, katılmak -t'yi kabul etmeyebilir ''.


1

Katılmak için argüman sonra -t bir karakterdir. Sıralama için daha uzun bir ayırıcı sağlayabilirsiniz. İstediğiniz farklı bir alandaki dosyalara katılıyor olabilirsiniz ve davayı görmezden gelmek sorunu tesadüfle çözer.

Ve Gilles ile aynı fikirdeyim, örnek verilerin yardımcı olacağını düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.