研究備忘録:テキストファイルの各行を並び替える
研究の過程で、次のようなテキストファイル
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このperlスクリプトを使ってUNIX上で
my $counter = 0;
while(<>) {
chomp;
my $modulo = $counter % 3000;
print "$modulo,$_\n";
$counter++;
}
$ perl addnum.pl datafile.txt | sort -t "," -n
と入力すると、ほしかった形式のデータファイルが標準出力に出力されます。
#ただし、各行に余計な数値とカンマが入るので、これを削除するスクリプトを書かないといけませんね。