複数のファイルをまとめてsortしたい
下記のように、地域別の複数のtsvファイルがあり、その中には年月に対する何らかの件数が入っていたとします。
% ls
中国.tsv 中部.tsv 九州.tsv 四国.tsv 東京.tsv 東北.tsv 近畿.tsv 関東.tsv 北海道.tsv
% head *
==> 中国.tsv <==
2019/12 26
2019/11 26
2019/10 30
2019/9 20
2019/8 28
2019/7 12
2019/6 16
2019/5 6
2019/4 22
2019/3 22
==> 中部.tsv <==
2019/12 43
2019/11 37
2019/10 42
2019/9 39
2019/8 36
2019/7 32
2019/6 24
2019/5 36
2019/4 35
2019/3 29
...
この複数のファイルに対して、件数が小さいもの10個を表示したいと思います。
sortコマンドだと元のファイル名がわからない
普通にsortコマンドを複数ファイルに対して実行すると、結果を見ても元のファイル名がわかりません。
% sort -k 2 -n * | head
2019/2 4
2019/1 5
2019/5 5
2019/5 6
2019/7 7
2019/6 8
2019/2 9
2019/3 9
2019/3 9
2019/3 10
grep & sort で解決
こういう時は、grepコマンドを通してからsortしましょう。そうするとファイル名を各行の先頭につけることができます。
% grep . * | sort -k 2 -n | head
北海道.tsv:2019/2 4
東京.tsv:2019/5 5
北海道.tsv:2019/1 5
中国.tsv:2019/5 6
東京.tsv:2019/7 7
東京.tsv:2019/6 8
東京.tsv:2019/2 9
四国.tsv:2019/3 9
東京.tsv:2019/3 9
四国.tsv:2019/5 10
何でgrepをつけるといいのか
何でこうできるかというと、grepを通すとその結果にファイル名がつくからですね。
今回はgrepで行を絞りたくはないので、全ての行にヒットするように grep .
にしています。
% grep . *
中国.tsv:2019/12 26
中国.tsv:2019/11 26
中国.tsv:2019/10 30
中国.tsv:2019/9 20
中国.tsv:2019/8 28
中国.tsv:2019/7 12
中国.tsv:2019/6 16
中国.tsv:2019/5 6
中国.tsv:2019/4 22
中国.tsv:2019/3 22
中国.tsv:2019/2 20
中国.tsv:2019/1 23
中部.tsv:2019/12 43
中部.tsv:2019/11 37
中部.tsv:2019/10 42
中部.tsv:2019/9 39
中部.tsv:2019/8 36
中部.tsv:2019/7 32
中部.tsv:2019/6 24
中部.tsv:2019/5 36
中部.tsv:2019/4 35
中部.tsv:2019/3 29
中部.tsv:2019/2 27
中部.tsv:2019/1 31
...
実は grep .
は空白行を無視してしまいますが、今回のような設定の場合は問題ないですよね。
あ、あと、 grep -H
を暗黙的に使っています。
参考