如何按两列的比例对CSV文件的列进行排序?

时间:2012-05-12 00:21:23

标签: bash awk

我有一个像这样的CSV文件:

bear,1,2
fish,3,4
cats,1,5
mice,3,3

我想按照第2列和第3列的比例从最高到最低排序。例如:

bear,1,2 # 1/2 = 0.5
fish,3,4 # 3/4 = 0.75
cats,1,5 # 1/5 = 0.2
mice,3,3 # 3/3 = 1

这将按如下方式排序:

mice,3,3
fish,3,4
bear,1,2
cats,1,5
  • 如何按第2列和第3列中两个数字的比例对列从最高到最低排序?

3 个答案:

答案 0 :(得分:6)

awk 'BEGIN { FS = OFS = ","} {$4 = $2/$3; print}' | sort -k4,4nr -t, | sed 's/,[^,]*$//' inputfile

或使用GNU AWK(gawk):

awk -F, '{a[$3/$2] = $3/$2; b[$3/$2] = $0} END {c = asort(a); for (i = 1; i <= c; i++) print b[a[i]]}' inputfile

上述方法优于以下方法,但这比使用Bash和各种实用程序的另一个答案更有效:

while IFS=, read animal dividend divisor
do
    quotient=$(echo "scale=4; $dividend/$divisor" | bc)
    echo "$animal,$dividend,$divisor,$quotient"
done < inputfile | sort -k4,4nr -t, | sed 's/,[^,]*$//'

作为一个单行:

while IFS=, read animal dividend divisor; do quotient=$(echo "scale=4; $dividend/$divisor" | bc); echo "$animal,$dividend,$divisor,$quotient"; done < inputfile | sort -k4,4nr -t | sed 's/,[^,]*$//'

答案 1 :(得分:1)

为什么不创建另一个包含第二列和第三列的比率的列,然后对该列进行排序?

答案 2 :(得分:1)

bash不适用于那样的东西 - 选择你自己喜欢的编程语言,并在那里做。

如果你坚持......这是一个例子:

a=( `cut -d "," -f 2 mat.csv` ); b=( `cut -d "," -f 3 mat.csv` );for i in {0..3};do (echo -n `head -n $((i+1)) mat.csv|tail -1`" "; echo "scale=4;${a[i]}/${b[i]}"|bc) ;done|sort -k 2 -r

修改文件名和长度。