シェルワンライナー ~シェル芸を極める道~ 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 ~]$