列の数と対応する単位の並べ替え

列の数と対応する単位の並べ替え

次のリストがあります。

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'

関連情報