sort
fornece dois tipos de classificação numérica. Isto é da página de manual:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
Qual é a diferença?
sort
não é aman
página, mas ainfo
página (info sort
).Respostas:
A classificação numérica geral compara os números como flutuantes, isso permite a notação científica, por exemplo, 1.234E10, mas é mais lenta e sujeita a erros de arredondamento (1.2345678 pode vir depois de 1.2345679), a classificação numérica é apenas uma classificação alfabética regular que sabe que 10 vem depois de 9.
Consulte http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
fonte
-k3.2n
ou-k3.2g
, ele está classificandoR10
antesR2
. A classificação é lexicográfica, não numérica. Espero que ele trate o campo do segundo caractere em diante como um número.sort
as principais especificações. são verdadeiramente bizantinos - resumindo, os espaços em branco que precedem o campo são considerados parte do campo , então char. o índice 1 aponta para o (primeiro) espaço em branco que precede o campo, não o primeiro caractere real do campo. Sufixe o char. index comb
para corrigir este problema, ou seja:-k 3.2bn,3
(observe que a opção global não funciona neste caso). Observe também o adicionado , que garante que apenas o 3º campo seja usado - sem esse 2º campo índice, o restante da linha inteira é usado.-b
,3
Você deve ter cuidado com sua localidade. Por exemplo, você pode querer classificar um número flutuante (como 2.2) enquanto sua localidade pode esperar o uso de uma vírgula (como 2,2).
Conforme relatado neste fórum , você pode ter resultados errados usando os sinalizadores -n ou -g.
No meu caso eu uso:
para classificar a 6ª coluna que contém:
com o propósito de obter
fonte
-n
reconhecer a vírgula como um separador de milhares - “1.000” é tratado da mesma forma que “1”.sort
usa a lógica do prefixo mais longo: a parte mais longa da linha / chave que ele reconhece como um número é usada; em um local que usa.
como caractere raiz, a leitura será interrompida em,
.LC_ALL=C
é de fato a escolha mais robusta ; entretanto, seLC_ALL
acontecer de não apostar definido,LANG=C
funcionará também.LANG=C sort -k 6,6n file
é mais simples e também localiza o efeito de definir a variável de ambienteLANG
para o comando específico.Além da resposta aceita cuja menção
-g
permite a notação científica , quero mostrar a parte que mais provavelmente causa um comportamento indesejável.Com
-g
:Veja as
zoo
três coisas importantes aqui:A linha começa com
NAN
(por exemplo,Nana
enani lol
) ou-INF
(um traço, não--INF
) move para o fim, mas antes dos dígitos. EnquantoINF
move para o último após os dígitos, porque significa infinito .O
NAN
,INF
e-INF
não diferenciam maiúsculas de minúsculas .As linhas sempre ignorar espaço em branco a partir de ambos os lados de
NAN
,INF
,-INF
(independentementeLC_CTYPE
). Outros alfabéticos podem ignorar os espaços em branco de qualquer lado, dependendo do localLC_COLLATE
(por exemplo,LC_COLLATE=fr_FR.UTF-8
ignorar, masLC_COLLATE=us_EN.UTF-8
não ignorar).Portanto, se você está classificando alfanuméricos arbitrários , provavelmente não deseja
-g
. Se você realmente precisa de comparação de notação científica com-g
, provavelmente deseja extrair dados alfabéticos e numéricos e fazer a comparação separadamente .Se você precisa apenas de
1, -1
classificação por número comum (por exemplo ), e acha que isso0x/E/+ sorting
não é importante, use apenas o-n
suficiente:Ou
-g
ou-n
, esteja ciente do efeito local . Você pode querer especificarLC_NUMERIC
comous_EN.UTF-8
evitar falha na classificação fr_FR.UTF-8-
com número flutuante :Com
LC_NUMERIC=en_US.UTF-8
:Ou
LC_NUMERIC=us_EN.UTF-8
para agrupar+|-|space
comalpha
:Você provavelmente deseja especificar
locale
quando usarsort
se deseja escrever um script portátil.fonte