Eu queria classificar uma lista de dados e pretendia classificá-la com base em sua primeira coluna, que é um endereço IP.
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.6
192.168.1.91
Na minha primeira máquina, testei sort -n
e funcionou como eu esperava
# coreutils, version: 8.31, release: 23
192.168.1.6
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.91
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
Mas na minha segunda máquina, não vai classificar corretamente
# coreutils, version:8.4
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.6
192.168.1.64
192.168.1.91
Ambas as máquinas têm a mesma localidadeen_US.UTF-8
Por que isso está acontecendo? Como posso resolvê-lo?
Sem uma posição de chave adequada,
sort
usa a linha inteira como chave. Como em todas as linhas, os três primeiros octetos permanecem os mesmos, toda a classificação é baseada nas posições numéricas do primeiro caractere no último octeto. Como1
aparece antes2
dos octetos com100
,101
aparece antes do outro.Defina a posição de chave adequada e use a classificação numérica. Por exemplo, no seu caso, defina o delimitador para a entrada como
.
e deixesort
trabalhar sua mágica apenas no 4º campo. As4,4
médias começam no 4º campo delimitado por.
e terminam no mesmo 4º campo.Além disso, você pode substituir quaisquer outras
locale
configurações definidas em seu sistema e usar diretamente o padrão do sistemaLC_ALL=C
localmente para o comando. Veja O queLC_ALL=C
faz? para entender por queGraças ao comentário de Kamil Maciorowski que destacou a questão real.