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ści „ leksykalnej ”, 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.