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

bashによるメタプログラミング

18.[even_2 , even_4 , odd_1 , odd_3]の4つのディレクトリを作成する

期待する結果
[opc@linux ~]$ ls -d odd* even*
even_2  even_4  odd_1  odd_3
[opc@linux ~]$ 
ヒント
seq 4 | awk 'コードを入れよ'| bash
答え
[opc@linux ~]$ seq 4 | awk '{print "mkdir " ($1%2 ? "odd_":"even_") $1}'| bash