dołącz: „Plik 2 nie jest posortowany”


13

Mam dwa pliki _jeter3.txt i _jeter1.txt

Sprawdziłem, że oba są posortowane według 20. kolumny za pomocą sort -c

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

ale występuje błąd, gdy chcę joinobu plików, mówi, że drugi plik nie jest sortowany:

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

Nie rozumiem dlaczego.

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

AKTUALIZACJA : użycie „ sort -f” i join -i(bez względu na wielkość liter) rozwiązuje problem. Ale to nie wyjaśnia mojego początkowego problemu.

AKTUALIZACJA : wersje sortowania i dołączania:

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

Czy możesz podać nam dane wyjściowe „join --version” i „sort --version” tylko ze względu na kompletność? Nie mogę uzyskać starszych wersji przyłączenia GNU, aby pod żadnym pozorem nie wyświetlały tego komunikatu o błędzie.
Bruce Ediger,

3
Proszę zamieścić przykładowe dane, które wykazują problem i dane wyjściowe locale.
Gilles „SO- przestań być zły”

Odpowiedzi:


25

Mam ten sam błąd z Ubuntu 11.04, ze sorti jointak w wersji (Coreutils GNU) 8.5.

Są wyraźnie niekompatybilne. W rzeczywistości sortpolecenie wydaje się być błędne: nie ma różnicy z opcją -f( --ignore-case) lub bez niej . Podczas sortowania aaBjest zawsze wcześniej aBa. Znaki nie alfanumeryczne również wydają się zawsze ignorowane ( abcwcześniej ab-x)

Dołącz wydaje się oczekiwać odwrotnej sytuacji ... Ale mam rozwiązanie

W rzeczywistości jest to powiązane z sekwencją sortowania: użycie LANG=en_EN sort -k 1,1 <myfile> ...następnie LANG=en_EN join ...eliminuje komunikat.

Internacjonalizacja jest źródłem zła ... (nikt nie dokumentuje tego wyraźnie).


Więc jeśli oba użyją LANG=en_EN, to na pewno zadziała? Czy będzie działał dla dowolnego ustawienia narodowego, o ile oba będą używać tego samego ustawienia narodowego? Możemy powiedzieć, że różnica między sorti jointo, że używają innego lokum domyślnie?
Aaron McDaid

Czy -kopcja jest tutaj odpowiedzią, czy też jest LANG=en_EN? Nie jest jasne, jakie jest dokładne rozwiązanie.
Użytkownik

5

Czy sortowałeś według liczb? Odkryłem, że wypełnienie zerem kolumny, do której dołączałem, rozwiązało dla mnie ten problem.

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

5

Jeśli masz pewność, że poprawnie posortowałeś pliki wejściowe, a ich linie można sparować, możesz uniknąć powyższego błędu, uruchamiając join --nocheck-order file1.txt file2.txt


4

sort domyślnie używa całej linii jako klucza

join używa tylko określonego pola jako klucza.

Musisz poprawić tę niezgodność, ograniczając sortowanie do używania tylko klucza, do którego chcesz dołączyć.

Strona podręcznika dołączenia stanowi:

Ważne: PLIKI 1 i PLIK2 należy posortować według pól łączenia. Np. Użyj „sort -k 1b, 1”, jeśli> „dołącz” nie ma żadnych opcji. Uwaga: porównania uwzględniają zasady określone przez „LC_COLLATE”. Jeśli wejście> nie jest posortowane i nie można połączyć niektórych wierszy, zostanie wyświetlony komunikat ostrzegawczy.


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

To rozwiąże twój problem. Problem, jak wskazał @Michael, to kolejność zestawiania, która zależy od twojego ustawienia LOCALE.


2

Zauważ, że jeśli widzisz ten błąd i już posortowałeś konkretną kolumnę i uderzasz głową o ścianę, np. Sort -k4,4, być może będziesz musiał ustawić separator dla polecenia sort

Najwyraźniej OP już to zrobił z opcją -t '', ale zalecałbym normalny tekst oddzielony tabulatorami

sort -t $'\t' ...

Polecenie sort może domyślnie zawierać spacje jako separatory nawet na czymś, co wygląda jak plik rozdzielany tabulatorami (szczególnie jeśli w kolumnie, w której sortujesz, są spacje).

Następnie, jeśli przekazałeś posortowane dane, aby dołączyć, i masz

join -t $'\t' ...

To powoduje, że komunikat o błędzie jest nieposortowany. Jak wspomniano powyżej, dołączenie może nie zaakceptować opcji -t ''.


1

Dla przyłączenia argument po -t jest znakiem. Do sortowania możesz podać dłuższy separator sortowania. Myślę, że możesz dołączać do plików w innym polu, które chcesz, a zignorowanie sprawy rozwiązuje problem przez przypadek.

Zgadzam się z Gillesem, że przykładowe dane byłyby pomocne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.