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ę join
obu 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.
(...)
locale
.Odpowiedzi:
Mam ten sam błąd z Ubuntu 11.04, ze
sort
ijoin
tak w wersji (Coreutils GNU) 8.5.Są wyraźnie niekompatybilne. W rzeczywistości
sort
polecenie wydaje się być błędne: nie ma różnicy z opcją-f
(--ignore-case
) lub bez niej . Podczas sortowaniaaaB
jest zawsze wcześniejaBa
. Znaki nie alfanumeryczne również wydają się zawsze ignorowane (abc
wcześniejab-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ępnieLANG=en_EN join ...
eliminuje komunikat.Internacjonalizacja jest źródłem zła ... (nikt nie dokumentuje tego wyraźnie).
źródło
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ędzysort
ijoin
to, że używają innego lokum domyślnie?-k
opcja jest tutaj odpowiedzią, czy też jestLANG=en_EN
? Nie jest jasne, jakie jest dokładne rozwiązanie.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.
źródło
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
źródło
sort
domyślnie używa całej linii jako kluczajoin
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:
źródło
To rozwiąże twój problem. Problem, jak wskazał @Michael, to kolejność zestawiania, która zależy od twojego ustawienia LOCALE.
źródło
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
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
To powoduje, że komunikat o błędzie jest nieposortowany. Jak wspomniano powyżej, dołączenie może nie zaakceptować opcji -t ''.
źródło
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.
źródło