Classificação de números e respectivas unidades em colunas

2

Eu tenho uma lista como esta:

1,kg,cat
1000,g,dog
20,g,apple

E eu quero classificá-lo por peso. 1 kg e 1000 g seriam os mesmos, então gostaria de ter minhas linhas ordenadas por peso. Meu conjunto de dados é maior e tem unidades diferentes, e quero saber como classificá-lo para que o código reconheça que 3000 g é maior que 1 kg e assim por diante.

    
por XY g 29.03.2015 / 03:12

3 respostas

4

Se o seu arquivo é muito grande para armazenar na memória, você poderia fazer:

$ awk -F, -v OFS="," '$2=="kg"{$1=1000*$1}1;' file | sort -n | 
    awk -F, -v OFS="," '$2=="kg"{$1=$1/1000}1;'
1000,g,dog
1,kg,cat
20,g,apple
    
por 29.03.2015 / 04:17
4

Prefiro a variante de não alterar os dados existentes, mas adicionar os critérios de classificação como nova coluna e remover o campo de classificação auxiliar no final do canal:

awk -F, 'BEGIN {u["kg"]=1000; u["g"]=1}; {print $1*u[$2], $0}' file |
    sort -n | cut -d" " -f2-
    
por 29.03.2015 / 06:35
2

Talvez seja melhor converter as unidades no arquivo, classificá-las e usar o arquivo armazenado resultante.

sed -r 's/^([0-9]+),kg/00,g/' $file | sort -n

sed não entende matemática, por isso, se você tiver não-intigers, precisará usar outra coisa. O seguinte faz o rápido analisar com sed, mas usa bc para fazer matemática real, se necessário.

sed -r 's/^([0-9]+),kg/00,g/;s/^([0-9\.]+),kg/echo $(echo *1000 | bc),g/e'
    
por 29.03.2015 / 04:43