次のリストがあります。
1,kg,cat
1000,g,dog
20,g,apple
重量順に並べ替えたいです。 1kgと1000gは同じなので重さごとに揃えたいです。私のデータセットは大きく、単位が異なり、コードが3000gが1kgより大きいことを認識できるようにソートする方法を知りたいです。
答え1
ファイルが大きすぎてメモリに収まらない場合は、次のことができます。
$ 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
答え2
私は既存のデータを変更しませんが、ソート基準を新しい列として追加し、パイプラインの末尾からセカンダリソートフィールドを削除するバリエーションを好みます。
awk -F, 'BEGIN {u["kg"]=1000; u["g"]=1}; {print $1*u[$2], $0}' file |
sort -n | cut -d" " -f2-
答え3
ファイルの単位を変換してソートした後、結果の保存ファイルを使用することをお勧めします。
sed -r 's/^([0-9]+),kg/\1000,g/' $file | sort -n
sed
数学を理解していないので、整数でない場合は他のものを使用する必要があります。以下は迅速な解析にsedを使用しますが、bc
必要に応じて実際の計算を実行します。
sed -r 's/^([0-9]+),kg/\1000,g/;s/^([0-9\.]+),kg/echo $(echo \1*1000 | bc),g/e'