我有一个这样的列表:
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'