先ほどの成績ファイルの例、score.csv
を元に、フィルタプログラムだけを利用して、合計点の高い順に並べ換えてみよう。
山田太郎,50,70,20
公益太郎,90,80,70
飯森花子,91,79,72
鶴岡一人,60,60,40
酒田三吉,52,70,80
三川一二三,12,34,99
これはCSVファイルなので、各フィールドに分解するにはawkコマンドを
使えば良い。区切りがカンマなので、awkのオプションに -F,
を指定するとカンマでフィールド分解をしてくれる。
「
cat score.csv | awk -F, 〜〜〜
」
としたときにawk変数に入る各フィールド
$1に入るもの $2に入るもの $3に入るもの $4に入るもの 山田太郎 50 70 20 公益太郎 90 80 70 飯森花子 91 79 72 鶴岡一人 60 60 40 酒田三吉 52 70 80 三川一二三 12 36 99
各レコードについて、合計点を求めるには、$2, $3, $4 を足せば良い。 awk言語は文字列と数値の区別があいまいである。本来 $2 $3 $4 は 入力レコードの部分文字列なので、どれも文字列なのだが、 数字だけの文字列なら足し算をすると数値同士と見なして足し算してくれる。 この性質を利用すると、成績のCSVファイルに合計点を追加する awk コマンドラインは以下のようになる。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}'
山田太郎,50,70,20,140
公益太郎,90,80,70,240
飯森花子,91,79,72,242
鶴岡一人,60,60,40,160
酒田三吉,52,70,80,202
三川一二三,12,34,99,145
これでCSV形式の第5フィールドに合計点が追加された。あとは、gsortコマン
ドで第5フィールドを数値と見なして並べ換えれば良い。gsortコマンドも
デフォルトではフィールド区切りが空白文字なので、-t ,
として
カンマでフィールド分割させる。数値と見なして並べ換えるのは
-n
オプション。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}' \
| gsort -t , -n -k 5
山田太郎,50,70,20,140
三川一二三,12,34,99,145
鶴岡一人,60,60,40,160
酒田三吉,52,70,80,202
公益太郎,90,80,70,240
飯森花子,91,79,72,242
おっとしまった、小さい順(昇順)に並んでしまったので、並べ換えを
逆にする -r
オプションもつけよう。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}' \
| gsort -r -t , -n -k 5
飯森花子,91,79,72,242
公益太郎,90,80,70,240
酒田三吉,52,70,80,202
鶴岡一人,60,60,40,160
三川一二三,12,34,99,145
山田太郎,50,70,20,140
順位をつけたかったら、行番号をつける cat -n
に渡す。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}' \
| gsort -r -t , -n -k 5 \
| cat -n
1 飯森花子,91,79,72,242
2 公益太郎,90,80,70,240
3 酒田三吉,52,70,80,202
4 鶴岡一人,60,60,40,160
5 三川一二三,12,34,99,145
6 山田太郎,50,70,20,140
先頭の空白が多すぎだと思ったら、sedコマンドで文字列の置換(s命令)を使って スペースを4つ削る。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}' \
| gsort -r -t , -n -k 5 \
| cat -n \
| sed 's/ //' (← s/ の後ろのスペースは4つ)
1 飯森花子,91,79,72,242
2 公益太郎,90,80,70,240
3 酒田三吉,52,70,80,202
4 鶴岡一人,60,60,40,160
5 三川一二三,12,34,99,145
6 山田太郎,50,70,20,140
ついでに、カンマもTAB文字に変えちゃえ。またsedの置換(s命令)を 使ってTAB文字に変換。
cat score.csv \
| awk -F, '{printf "%s,%d,%d,%d,%d\n", $1, $2, $3, $4, $2+$3+$4}' \
| gsort -r -t , -n -k 5 \
| cat -n \
| sed 's/ //' \
| sed 's/,/ /g' (← の部分はC-v TABで入力)
1 飯森花子 91 79 72 242
2 公益太郎 90 80 70 240
3 酒田三吉 52 70 80 202
4 鶴岡一人 60 60 40 160
5 三川一二三 12 34 99 145
6 山田太郎 50 70 20 140
プログラム書かなくっても、終わっちゃった、てへ。