LoginSignup
0
0

More than 3 years have passed since last update.

複数ファイルをsortしたときに元のファイル名もつけておきたい

Posted at

複数のファイルをまとめて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 を暗黙的に使っています。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0