ZAKTUALIZOWANA ODPOWIEDŹ:
PROBLEM:
OP otrzymuje komunikat o błędzie „ plik nie jest posortowany ” podczas comm
poró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 -n
przełącznika z sort
poleceniem użytym do sortowania dostarczonych wyników comm
kolejność zwracanych wyników comm
może być bardzo różna:
Lexograficzne : użycie -n
przełącznika z sortowaniem spowoduje uporządkowanie „dodatnich liczb całkowitych” w szeregu rosnących liczb. „ Błąd ” można stłumić za pomocą comm
przełącznika „s”--nocheck-order
Kolejność bajtów : NIE ma zastosowania -n switch
z sort
. LC_COLLATE
określa kolejność, która może nawet różnić się w zależności od sposobu locale
ustawienia na hoście, na którym wykonywane jest polecenie. Jest to dane wejściowe comm
domyślnie oczekiwane. Więcej informacji na ten temat LC_COLLATE
moż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,comm
zwraca 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 switch
sort
Jeśli jednak nie chcesz wyników w kolejności „ leksykalnej ”, NIE używaj -n
przełącznika do sortowania dostarczonych danych do comm
porównania.
TESTOWANIE:
Porównamy wyniki comm
polecenia z -n
przełą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 -n
przełą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 comm
bez -n
przełącznika, ale na posortowanej liście.
Różnica :
Wymień tylko liczby unikalne dla każdego pliku:
Bez -n
przełą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 comm
bez -n
przełą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-order
aby ukryć komunikat o błędzie. Ponieważ wiemy, że liczby nie są sortowane w każdym pliku, ale wyniki zwracane przez comm -n
są 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ą -n
przełącznika comm
są nieprawidłowe. Rzeczywiście, użycie comm -n
zwró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.