Comportamento errado do comando de classificação?

14

Tentei classificar o conteúdo de um arquivo no Ubuntu desktop 14.04 (Trusty Tahr). No meu caso, o resultado esperado deve ser o mesmo do conteúdo original, mas o resultado real não é. Por quê?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
user2909884
fonte
4
Entrego-lhe um pequeno troféu de premiação pelo seu uso inútilcat .
David Foerster
3
O comentário de @DavidFoerster é uma maneira engraçada de apontar que você pode substituir cat test.txt | sortpor sort test.txt:)
Volker Siegel
@ VolkerSiegel: É verdade, embora existam formulações úteis catpara começar. Por exemplo cat FILE | grep dev | sort, somente as linhas com "dev" serão exibidas (em ordem classificada). Usar sort FILE | grep devproduz a mesma saída, mas colorida.
AlainD

Respostas:

17

Você pode usar a LC_ALLvariável, configurá-la para LC_ALL=Cantes de chamarsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Leia esta resposta, se você quiser saber o que é isso magicamente LC_ALL=C. Aqui está um breve resumo:

O código de idioma C é um código de idioma especial que deve ser o código de idioma mais simples. Você também pode dizer que, enquanto os outros locais são para humanos, o local C é para computadores. No código de idioma C, os caracteres são bytes únicos, o conjunto de caracteres é ASCII, a ordem de classificação é baseada nos valores de bytes.

Além disso, como apontou o @KenMollerup, cite man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Portanto, ao usar classificar com LC_ALL=C, classifique os símbolos de comparação bytewise. Caso contrário sort, ignorará todos os caracteres não alfanuméricos.

c0rp
fonte
Desculpe, não vi isso, eu reagi ao comentário!
Ken Mollerup
@KenMollerup obrigado por apontar para man sort. Eu não percebi isso
c0rp 17/03/2015
8

A classificação usa classificação alfabética e numérica, assim como nós, caracteres especiais como + - <> ... são ignorados, os números são tratados numéricos de modo que 1, 2, 3 .. vem antes de 11, 12 1066 1104 - veja!

Portanto, sua lista é vista como: aa, ab, ab, ac, ac

Ken Mollerup
fonte
Existe alguma opção para classificação, de modo que não ignore caracteres especiais, de modo que test.txt classifique da maneira desejada?
Doug Smythies 17/03/2015
6
Veja isso em man sort: *** AVISO *** O código do idioma especificado pelo ambiente afeta a ordem de classificação. Defina LC_ALL = C para obter a ordem de classificação tradicional que usa valores de bytes nativos.
Ken Mollerup
@KenMollerup, adicione mais informações à sua resposta. Adicionar cotação de man sort, adicionar exemplos.
C0rp 17/03/2015
Sim, mas eu estava muito lenta, veja a resposta do c0rp abaixo.
Ken Mollerup