研究備忘録:テキストファイルの各行を並び替える

研究の過程で、次のようなテキストファイル

1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
11行目
12行目









を次のように並び替える必要に迫られました。

1行目

4行目

7行目

10行目

2行目
5行目
8行目
11行目

3行目
6行目
9行目
12行目











つまり、1行目の次は3行スキップして4行目、これを繰り返し、ファイルの最後にきたら、2行目、さらに3行スキップして。。。というのを繰り返すわけです。

12行くらいのファイルだったら手作業でも問題ないのですが、実際のデータは約300万行、スキップする行は3000行というものです。手作業ではやってられません。というわけで、次のような perl スクリプト addnum.pl と UNIX のコマンド sort を使って解決しました。

# addnum.pl
my $counter = 0;

while(<>) {
    chomp;
    my $modulo = $counter % 3000;
    print "$modulo,$_\n";
    $counter++;
}

このperlスクリプトを使ってUNIX上で
$ perl addnum.pl datafile.txt | sort -t "," -n
と入力すると、ほしかった形式のデータファイルが標準出力に出力されます。

#ただし、各行に余計な数値とカンマが入るので、これを削除するスクリプトを書かないといけませんね。