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
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.
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
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-
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'
Tags text-processing sort