シェルワンライナー ~シェル芸を極める道~ 3歩目
sortとuniqによる集計
問 14.前回のおさらい
出力される1~5の数字に対して奇数、偶数を判定する
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' 奇数 偶数 奇数 偶数 奇数 [opc@linux ~]$
↓のように書いても良いが、【条件 ? 条件が正の場合:条件が偽の場合】と記述することができ、見た目ものスッキリすので覚えておいて損はない
seq 5 | awk '$1%2{print "奇数"}$1%2{print "偶数"}'
問 15.sortを使った並び替え
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort 偶数 偶数 奇数 奇数 奇数 [opc@linux ~]$
問 16.uniqを使ったカウント
uniqのオプション-cをつけることでカウントしている
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c 2 偶数 3 奇数 [opc@linux ~]$
豆知識
uniqは出力が連続した値同士で並んでいる必要がある。
↓のようにsortせずにバラバラの状態でuniqを使うとそれぞれでカウントされる
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | uniq -c 1 奇数 1 偶数 1 奇数 1 偶数 1 奇数 [opc@linux ~]$
17.問14~16を工夫して奇数偶数をカウントする
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c | awk '{print $2,$1}' 偶数 2 奇数 3 [opc@linux ~]$
別解
a[$1]の連想配列を使った別解になります。
[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | awk '{a[$1]++}END{for(k in a)print k,a[k]}' 奇数 3 偶数 2 [opc@linux ~]$