シェルやgrepコマンドなどでデータを集計する方法


## 入力データ

次のようなテキストファイルがあるとします。

[code]

    日付  ARTIST  滝廉太郎
    日付  ARTIST  滝廉太郎
    日付  ARTIST  滝廉太郎
    日付  SONG    荒城の月
    日付  ARTIST  滝廉太郎
    日付  ARTIST  山田耕筰
    日付  ARTIST  山田耕筰
    日付  ARTIST  滝廉太郎
    
[/code]

日付のところは日付が入ります（2017年1月10日など）が今回は使用しません。

タブで区切られて次の列は"ARTIST"か"SONG"が来ます。

三番目の列には二番目の列に応じて、アーティスト名か曲名が来ます。

## 欲しい結果

[code]

       5 滝廉太郎
       2 山田耕筰
    
[/code]

このデータから人気のあるアーティストを知りたいと言われたときに、もちろんスクリプト言語などでプログラムを書けば作れますが、30秒でやりたいようなときにはシェルが便利です。

あれこれ調べて工夫したところ

[code]

    cat data.txt | grep -o "\tARTIST\t.*" | sort | uniq -c | sort -nr
    
[/code]

とすることで

[code]

    5   ARTIST  滝廉太郎
    2   ARTIST  山田耕筰
    
[/code]

までは得られました。これで十分な結果ではありますが、"ARTIST"の文字が不要です。

Rubyなどのスクリプト言語では正規表現の一部を()で囲むことでその部分を取り出せますが、コマンドラインのgrepで同じことをするにはどうすればよいのでしょうか？

ちなみに

[code]

    cat data.txt | grep -o "\tARTIST\t.*" | grep -o "ARTIST\t.*$" | grep -o "\t.*$" | grep -o "\S.*$" | sort | uniq -c | sort -nr
    
[/code]

のように何段もgrepを重ねれば

[code]

       5 滝廉太郎
       2 山田耕筰
    
[/code]

にすることはできますが、もう少しシンプルな方法があるのではないかと思い質問してみました。

よろしくお願いします。




metropolisさんのコメントでの回答で十分シンプルだと思いますが、grepとcutをawkで済ませる方法もあります。  
`cat data.txt | awk '$2=="ARTIST" {print $3}' | sort | uniq -c | sort -nr`




metropolisさんのコメントでの回答で十分シンプルだと思いますが、grepとcutをawkで済ませる方法もあります。  
`cat data.txt | awk '$2=="ARTIST" {print $3}' | sort | uniq -c | sort -nr`

