ファイルを指定した行番号で区切る

splitコマンドは、指定したバイト数、もしくは行数でファイルを分割するコマンドです。

takk@deb8:~$ seq 30 | split -dl6
takk@deb8:~$ wc -l x*
 6 x00
 6 x01
 6 x02
 6 x03
 6 x04
30 合計
takk@deb8:~$ head -1 x*
==> x00 <==
1

==> x01 <==
7

==> x02 <==
13

==> x03 <==
19

==> x04 <==
25
takk@deb8:~$ 

それはそれで便利ではありますが、等間隔だけの分割では物足りないなあと思うときもあります。
ファイルを好きな行数毎に分割したい場合は、指定した行番号で分割するcsplitコマンドが使えます。

1〜41までの連番の数列を、2行、3行、5行、7行、13行のファイルに分割してみます。

takk@deb8:~$ seq 41 | csplit - 3 6 11 18 29
4
6
11
21
33
39
takk@deb8:~$ wc -l x*
  2 xx00
  3 xx01
  5 xx02
  7 xx03
 11 xx04
 13 xx05
 41 合計
takk@deb8:~$ head -1 x*
==> xx00 <==
1

==> xx01 <==
3

==> xx02 <==
6

==> xx03 <==
11

==> xx04 <==
18

==> xx05 <==
29
takk@deb8:~$

ところで csplit へ与える行番号 3 6 11 18 29の算出が面倒です。
各ファイルの必要行数がわかったら、dcなどを使って計算しましょう。

takk@deb8:~$ dc -e "1 2+p 3+p 5+p 7+p 11+p 13+p"
3
6
11
18
29
42
takk@deb8:~$ 

+pとか書くのが面倒な時は、printfでも。

takk@deb8:~/tmp$ (echo 1;printf " %g+p" 2 3 5 7 11 13) | dc
3
6
11
18
29
42
takk@deb8:~/tmp$ 

2 responses to “ファイルを指定した行番号で区切る

  1. I’d prefer to second the thing that was said above.

    I like this.

  2. Here is a free way to humidify a room.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA