对列中的数字和相应单位进行排序

对列中的数字和相应单位进行排序

我有一个这样的列表:

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

我想按重量排序。 1 公斤和 1000 克是相同的,所以我想按重量对行进行排序。我的数据集更大并且有不同的单位,我想知道如何对其进行排序,以便代码可以识别 3000 g 大于 1 kg 等等。

答案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'

相关内容