Classificando um arquivo CSV por uma coluna com valores alfanuméricos

1

Eu tenho um arquivo CSV de amostra com o seguinte conteúdo:

$ cat SAMPLE.CSV 
compid,active,tagno
-2147483646,1,"1"
-2147483645,0,"10000"
-2147483644,0,"1002"
-2147483127,1,"76245.1"
-2147483126,1,"76245.2"
-2147468087,1,"76245"
-2147466194,1,"1361B.2"
-2147466195,1,"1361B.1"
-2147466196,1,"1361B"

Eu quero classificar pela terceira coluna chamada tagno , mas quero que ela respeite os valores alfanuméricos nessa coluna.

O resultado desejado deve ser assim:

compid,active,tagno
-2147483646,1,"1"
-2147483644,0,"1002"
-2147466196,1,"1361B"
-2147466195,1,"1361B.1"
-2147466194,1,"1361B.2"
-2147483645,0,"10000"
-2147468087,1,"76245"
-2147483127,1,"76245.1"
-2147483126,1,"76245.2"

Eu tentei o seguinte:

$ sort -t'"' -k2n SAMPLE.CSV
compid,active,tagno
-2147483646,1,"1"
-2147483644,0,"1002"
-2147466194,1,"1361B.2"
-2147466195,1,"1361B.1"
-2147466196,1,"1361B"
-2147483645,0,"10000"
-2147468087,1,"76245"
-2147483127,1,"76245.1"
-2147483126,1,"76245.2"

Mas você pode ver que 1361B , 1361B.1 e 1361B.2 estão quase em ordem inversa.

    
por Joshua Pinter 25.03.2018 / 00:41

1 resposta

3

Use a opção --version-sort em sort .

Se você olhar o manual ( man sort ), sort tem uma opção para classificação por números de versão. Aqui está a entrada:

-V, --version-sort
             Sort version numbers.  The input lines are treated as file
             names in form PREFIX VERSION SUFFIX, where SUFFIX matches
             the regular expression "(.([A-Za-z~][A-Za-z0-9~]*)?)*".  The
             files are compared by their prefixes and versions (leading
             zeros are ignored in version numbers, see example below).
             If an input string does not match the pattern, then it is
             compared using the byte compare function.  All string com-
             parisons are performed in C locale, the locale environment
             setting is ignored.

Isso parece respeitar valores alfanuméricos muito melhor do que -n ou -g classificação.

Usando o sinal -V na terceira coluna, você obtém o resultado desejado:

$ sort -t'"' -k2V SAMPLE.CSV
compid,active,tagno
-2147483646,1,"1"
-2147483644,0,"1002"
-2147466196,1,"1361B"
-2147466195,1,"1361B.1"
-2147466194,1,"1361B.2"
-2147483645,0,"10000"
-2147468087,1,"76245"
-2147483127,1,"76245.1"
-2147483126,1,"76245.2"
    
por 25.03.2018 / 00:41