Estou tentando classificar alguns dados delimitados por pipe simples. No entanto, classificar não é realmente classificar. Ele move minha linha de cabeçalho para a parte inferior, mas minhas duas linhas começando com 241 estão sendo divididas por uma linha começando com 24.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Os cabeçalhos das colunas estão sendo movidos para a parte inferior do arquivo, portanto, sort está claramente processando-o. Mas, os valores reais não estão sendo classificados como eu esperava.
Neste caso eu trabalhei em torno disso com
sort sort_fail.csv --field-separator='|' -k1,1
Mas, eu sinto que isso não deveria ser necessário. Por que a classificação não está classificando?
sort
está ciente da localidade, portanto, dependendo de sua configuração LC_COLLATE (que é herdada de LANG), você pode obter resultados diferentes:Isso pode causar problemas em scripts, porque você pode não estar ciente de qual localidade de chamada está definida e, portanto, pode obter resultados diferentes.
Não é incomum que os scripts forcem a configuração necessária
por exemplo
Agora, o que é interessante, aqui, é que o
|
personagem parece estranho.Mas isso ocorre porque a regra padrão para en_US, que deriva de ISO, diz
O que significa que o
|
caractere é ignorado e a ordem de classificação seria como se o caractere não existisse.E isso corresponde à classificação "inesperada" que você está vendo.
As soluções alternativas são usar
-n
(para forçar classificações numéricas) ou usar o separador de campo (como você fez) ou usar aC
localidade.O que me irrita é que o
24
não se move de seu lugar entre os dois241
. O segundo campo começa com um1
. Tentando a classificação com uma entrelinha4
no segundo campo, o24
é movido para baixo, então suspeito quesort
apenas ignora o a|
menos que seja dito o contrário. Experimentesort -n
...-n, --numeric-sort compara de acordo com o valor numérico da string
Sem o -n, 210 por texto está à frente de 23, pois vai personagem meu personagem.