uniqコマンドで重複行をカウントしてランキングを求める

下記のようなテキストを考える。誰が最もログインしているか知りたい。

$ cat test.txt
"login"=>"admin"
"login"=>"guest"
"login"=>"guest"
"login"=>"mike"
"login"=>"admin"
"login"=>""
"login"=>""
"login"=>""
"login"=>""
"login"=>"taro"
"login"=>"jiro"
"login"=>"jiro"

重複行のカウント。

$ uniq -c test.txt
1 "login"=>"admin"
2 "login"=>"guest"
1 "login"=>"mike"
1 "login"=>"admin"
4 "login"=>""
1 "login"=>"taro"
2 "login"=>"jiro"

sortコマンドで数字順に並び替え(ランキング)。

$ uniq -c test.txt | sort -nr
4 "login"=>""
2 "login"=>"jiro"
2 "login"=>"guest"
1 "login"=>"taro"
1 "login"=>"mike"
1 "login"=>"admin"
1 "login"=>"admin"

bashのヒアドキュメントを利用するともっと便利。

$ uniq -c << EOS | sort -nr
> "login"=>"admin"
> "login"=>"guest"
> "login"=>"guest"
> "login"=>"mike"
> "login"=>"admin"
> "login"=>""
> "login"=>""
> "login"=>""
> "login"=>""
> "login"=>"taro"
> "login"=>"jiro"
> "login"=>"jiro"
> EOS
4 "login"=>""
2 "login"=>"jiro"
2 "login"=>"guest"
1 "login"=>"taro"
1 "login"=>"mike"
1 "login"=>"admin"
1 "login"=>"admin"