質問: 入力データ ----- 次のようなテキストファイルがあるとします。 ``` 日付 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 山田耕筰 ``` にすることはできますが、もう少しシンプルな方法があるのではないかと思い質問してみました。 よろしくお願いします。
回答: ``` $ sed -n 's/^.*\tARTIST\t//p' data.txt |sort |uniq -c |sort -nr 5 滝廉太郎 2 山田耕筰 ``` `\t` が使えない `sed` もあるので注意。その場合はシェルの種類や設定に依りますが、`\t` の 代わりに Ctrl+v, Tab と打って Tab 文字を入力しましょう。