comm: plik nie jest posortowany


9

Kiedyś comm, aby porównać dwa posortowane pliki. Każda linia w tych plikach jest dodatnimi liczbami całkowitymi. Ale wyniki pokazują

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Skąd bierze się błąd, nawet jeśli te dwa pliki są posortowane?


W moim przypadku sortowałem (leksykograficznie) pliki za pomocą notatnika ++, który rozpatruje małe litery i wielkie litery osobno, np. a pojawi się po „Z” w porządku rosnącym. Różni się to od sposobu sortowania narzędzia sortowania (bash). Aby to zweryfikować, przekonwertowałem wszystkie wiersze na wielkie litery, a następnie posortowałem w np ++, comm już nie narzekał.
Sahil Singh,

Odpowiedzi:


10

commwymaga sortowania leksykograficznego (zwykłego sort), a nie sortowania numerycznego ( sort -n). Na przykład chce mieć następującą kolejność:

1
2000
300

Nie w następującej kolejności:

1
300
2000

Napraw to, a problem powinien zniknąć. Dla bardziej ezoterycznych przypadkach comm„s locale może być inna niż sortlokalizacji, może chcesz uruchomić sorti commze LC_COLLATE=Cw ich środowisku użyć natywną kolejność bajtów.


jak zrobić to sortować numerycznie?
wenzi


Porządkowanie leksykalne ” to miejsce, w którym seria liczb ZWIĘKSZA w uporządkowanych seriach - masz odpowiedź wstecz: mathworld.wolfram.com/LexicographicOrder.html . Proszę odnieść się do wyników badań mojego poniższa odpowiedź, która porównanie wykorzystania sort z , i bez z -nprzełącznikiem i pokazuje tylko z tym -nprzełącznikiem można osiągnąć prawidłowe zwiększając zamówienie kiedy uznają to jest wymagane w swoim własnym odpowiedź.
F1Linux

@ F1Linux Co? commdosłownie wymaga LC_COLLATEzamówienia. Wystarczy powiedzieć, że błędy w odpowiedzi nie są czysto kosmetyczne w przypadku przykładów spoza zestawu testowego ... nikt nie prosił o pozytywne sortowanie numeryczne.
Chris Down,

@ChrisDown Twoja odpowiedź, na którą odpowiedziałem - nie ta, którą właśnie edytowałem i tylko TERAZ wspomina o „ LC_COLLATE ” brzmiała: „ comm chce sortowania literalleksograficznego, a nie numerycznego. Popraw to, a problem powinien zniknąć. ” Teraz, gdzie w „LC_COLLATE” było coś, co jest zupełnie inną bestią niż sortowanie „_Leksograficzne”. Rzeczywiście, twoja początkowa odpowiedź była tak rzadka, że ​​zawierała zaledwie jedną linijkę BEZ PRZYKŁADÓW, co skłoniło mnie do ponownego pytania z moją własną odpowiedzią. Głosuję nad Twoją zaktualizowaną odpowiedzią, ponieważ „LC_COLLATE” zdecydowanie działa tutaj, jak zauważyłeś.
F1Linux

0

ZAKTUALIZOWANA ODPOWIEDŹ:

PROBLEM:

OP otrzymuje komunikat o błędzie „ plik nie jest posortowany ” podczas commporównywania dodatnich liczb całkowitych w plikach, a nie w tekście. Mamy więc do czynienia z liczbami nie dziesiętnymi.

Krótka odpowiedź:

W zależności od użycia -nprzełącznika z sortpoleceniem użytym do sortowania dostarczonych wyników commkolejność zwracanych wyników commmoże być bardzo różna:

Lexograficzne : użycie -nprzełącznika z sortowaniem spowoduje uporządkowanie „dodatnich liczb całkowitych” w szeregu rosnących liczb. „ Błąd ” można stłumić za pomocą commprzełącznika „s”--nocheck-order

Kolejność bajtów : NIE ma zastosowania -n switchz sort. LC_COLLATEokreśla kolejność, która może nawet różnić się w zależności od sposobu localeustawienia na hoście, na którym wykonywane jest polecenie. Jest to dane wejściowe commdomyślnie oczekiwane. Więcej informacji na ten temat LC_COLLATEmożna znaleźć tutaj: Reference1 i Reference2

Czy błąd jest problemem? To zależy od tego, co próbujesz osiągnąć. Jak zobaczymy w poniższych przykładach,commzwraca te same wyniki po porównaniu plików z przełącznikiem`slub bez , chociaż ich kolejność będzie się różnić w powyższy sposób, w zależności od tego, czyjest używany zpoleceniem. Ja wolę uporządkowane wyniki „leksykalne” - liczby, które rosną w szeregu.sort-n-n switchsort

Jeśli jednak nie chcesz wyników w kolejnościleksykalnej ”, NIE używaj -nprzełącznika do sortowania dostarczonych danych do commporównania.

TESTOWANIE:

Porównamy wyniki commpolecenia z -nprzełącznikiem i bez niego . Zwiększyłem złożoność mojego zestawu danych testowych na żądanie Kusalanandy:

Dane testowe :

plik1.txt :

40
110000
2200
6
33000

plik2.txt :

2200
40
33000
6
440000

Skrzyżowanie :

Wymień tylko liczby wspólne dla OBU plików

Bez -nprzełącznika:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Wyniki : poprawne, ale zwrócone w niesortowanej kolejności

Z -n przełącznikiem:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

Wyniki : Prawidłowe, ale zwrócone w kolejności posortowanej LEXOGRAFICZNIE . Operacja zakończyła się pomyślnie i zwróciła takie same wyniki jak użycie commbez -nprzełącznika, ale na posortowanej liście.

Różnica :

Wymień tylko liczby unikalne dla każdego pliku:

Bez -nprzełącznika:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

Wyniki : Prawidłowo - liczby te są rzeczywiście wyłączne dla każdego odpowiedniego pliku.

Z -n przełącznikiem:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

Wyniki : Prawidłowe, takie same wyniki jak commbez -nprzełącznika, ale zwraca błąd dotyczący kolejności sortowania liczb całkowitych dodatnich w samych plikach.

ROZWIĄZANIE DLA WYNIKÓW LEKOGRAFICZNYCH:

Użyj przełącznika comm`s, --nocheck-orderaby ukryć komunikat o błędzie. Ponieważ wiemy, że liczby nie są sortowane w każdym pliku, ale wyniki zwracane przez comm -nsą poprawne, błąd można bezpiecznie zignorować, pomijając go:

Skrzyżowanie :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Różnica :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

WNIOSEK:

Błąd „ plik nie jest posortowany ”, gdy zwracane są posortowane dodatnie liczby całkowite comm, nie oznacza, że ​​wyniki zwrócone za pomocą -nprzełącznika commsą nieprawidłowe. Rzeczywiście, użycie comm -nzwróci porządek w uporządkowanej kolejności!

Dzięki @dhag, @kusalananda @ChrisDown za zgłaszanie problemów wymagających dalszego rozszerzenia. Zawsze cieszę się z przeglądu mojej pracy: jedynym sposobem na poprawę sytuacji jest ciągły nacisk i wyzwanie ze strony naszych rówieśników.


W najczęściej głosowanej odpowiedzi wspomniano, że „comm chce sortowania leksykograficznego”, ale wydaje się, że sortujesz liczbowo. Wygląda na to, że w niektórych przypadkach spadnie.
dhag

Przetestuj ponownie z liczbami, które sortują się inaczej numerycznie i leksykograficznie, na przykład 1000, 200, 30, 4.
Kusalananda

@Kusalananda Właśnie uwzględniłem Twoją bardzo miłą i przydatną opinię w mojej zaktualizowanej odpowiedzi. Najbardziej zobowiązany do twojej opinii!
F1Linux

@dhag właśnie zaktualizował moją odpowiedź, aby uwzględnić opinie użytkowników i Kusalanady. Najbardziej zobowiązani dla was, ludzie, którzy poświęcili czas i wysiłek na sprawdzenie mojej odpowiedzi
F1Linux

1
@JeffSchaller Odpowiedź, na którą początkowo odpowiedziałem, zawiera wzmiankę o sortowaniu „leksykalnym”, a nie „LC_COLLATE”, jak w nowo poprawionej odpowiedzi Chrisa. Odpowiedziałem Chrisowi, że to prawda, i głosowałem za jego zaktualizowaną odpowiedzią. „Lexograficzne” i „LC_COLLATE” to różne bestie. Dzięki Jeff-
F1Linux
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.