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.
(...)
Pierre
źródło
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).

Michael
źródło
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
Conor
źródło
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

Yoav Weiss
źródło
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.

PeterVermont
źródło
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.

Jignesh Smart
źródło
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 ''.

Colin D.
źródło
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.

Paweł Brodacki
źródło