3

次のような 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 の 2 つの数値の比率で列を最高から最低に並べ替えるにはどうすればよいですか?
4

3 に答える 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

上記の方法は以下よりも優れていますが、これは 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/,[^,]*$//'
于 2012-05-12T00:43:17.650 に答える
1

2 番目と 3 番目の列の比率を保持する別の列を作成し、その列で並べ替えてみませんか?

于 2012-05-12T00:25:58.107 に答える
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

ファイル名と長さを変更します。

于 2012-05-12T03:46:34.110 に答える