Estou tentando classificar alguns dados simples delimitados por canal. No entanto, a classificação não é realmente uma classificação. Move a linha do meu cabeçalho para baixo, 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, a classificação está claramente processando-o. Mas, os valores reais não estão sendo classificados como eu esperaria.
Nesse caso, trabalhei com ele
sort sort_fail.csv --field-separator='|' -k1,1
Mas sinto que isso não seria necessário. Por que a classificação não está classificada?
LC_COLLATE=C sort
. Dependendo do que você está esperando, também pode ser necessárioLC_COLLATE=C sort -t'|' -n
csvsort
a partircsvkit
, que corretamente trata valores cotados.Respostas:
sort
tem conhecimento do código do idioma, portanto, dependendo da sua configuração LC_COLLATE (herdada do LANG), você poderá obter resultados diferentes:Isso pode causar problemas nos scripts, porque você pode não estar ciente de como o local de chamada está definido e, portanto, pode obter resultados diferentes.
Não é incomum os scripts forçarem a configuração necessária
por exemplo
Agora, o interessante aqui é que o
|
personagem parece estranho.Mas isso ocorre porque a regra padrão para en_US, que deriva da ISO, diz
O que significa que o
|
personagem é ignorado e a ordem de classificação seria como se o personagem 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 campos (como você fez) ou usar oC
código de idioma.fonte
--debug
opção, que indica a chave (sublinhada) usada para compararsort
está usando a linha inteira em vez de parar nos caracteres que supomos que seja.O que me irrita é que o
24
não se move do seu lugar entre os dois241
. O segundo campo começa com a1
. Tentando o tipo com uma liderança4
no segundo campo, o24
é movido para baixo, então suspeito quesort
apenas ignore o|
menos que seja dito o contrário. Tentesort -n
...fonte
-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 caracterizar meu personagem.
fonte