2012-05-12 84 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

相關問題