シェルやgrepコマンドなどでデータを集計する方法
入力データ
次のようなテキストファイルがあるとします。
日付 ARTIST 滝廉太郎
日付 ARTIST 滝廉太郎
日付 ARTIST 滝廉太郎
日付 SONG 荒城の月
日付 ARTIST 滝廉太郎
日付 ARTIST 山田耕筰
日付 ARTIST 山田耕筰
日付 ARTIST 滝廉太郎
日付のところは日付が入ります(2017年1月10日など)が今回は使用しません。
タブで区切られて次の列は"ARTIST"か"SONG"が来ます。
三番目の列には二番目の列に応じて、アーティスト名か曲名が来ます。
欲しい結果
5 滝廉太郎
2 山田耕筰
このデータから人気のあるアーティストを知りたいと言われたときに、もちろんスクリプト言語などでプログラムを書けば作れますが、30秒でやりたいようなときにはシェルが便利です。
あれこれ調べて工夫したところ
cat data.txt | grep -o "\tARTIST\t.*" | sort | uniq -c | sort -nr
とすることで
5 ARTIST 滝廉太郎
2 ARTIST 山田耕筰
までは得られました。これで十分な結果ではありますが、"ARTIST"の文字が不要です。
Rubyなどのスクリプト言語では正規表現の一部を()で囲むことでその部分を取り出せますが、コマンドラインのgrepで同じことをするにはどうすればよいのでしょうか?
ちなみに
cat data.txt | grep -o "\tARTIST\t.*" | grep -o "ARTIST\t.*$" | grep -o "\t.*$" | grep -o "\S.*$" | sort | uniq -c | sort -nr
のように何段もgrepを重ねれば
5 滝廉太郎
2 山田耕筰
にすることはできますが、もう少しシンプルな方法があるのではないかと思い質問してみました。
よろしくお願いします。