2012-05-12 57 views
3

我有一个CSV文件是这样的:如何按两列比例对CSV文件的列进行排序?

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

我想对它进行排序,从最高到最低,通过列2和3 EG的比例:

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?

回答

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 

的方法是比下面更好,但这是比使用击和各种实用程序另一个答案更有效:

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

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 

修改文件名和长度。

+0

I.e. “选择你最喜欢的编程语言,它与bash不同......”:) – Kaz

相关问题