我有一个这样的CSV文件:
bear,1,2
fish,3,4
cats,1,5
mice,3,3
Run Code Online (Sandbox Code Playgroud)
我想按照第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
Run Code Online (Sandbox Code Playgroud)
这将按如下方式排序:
mice,3,3
fish,3,4
bear,1,2
cats,1,5
Run Code Online (Sandbox Code Playgroud)
awk 'BEGIN { FS = OFS = ","} {$4 = $2/$3; print}' | sort -k4,4nr -t, | sed 's/,[^,]*$//' inputfile
Run Code Online (Sandbox Code Playgroud)
或使用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
Run Code Online (Sandbox Code Playgroud)
上面的方法比以下方法更好,但这比使用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/,[^,]*$//'
Run Code Online (Sandbox Code Playgroud)
作为单线:
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/,[^,]*$//'
Run Code Online (Sandbox Code Playgroud)