Powershellで指定した行数でファイルを分割する

例えばカレントディレクトリのtest.txtを3行ごとにtest[N].txtに分割するときは以下のように書く(は任意の0以上の整数)

$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }

cat(=Get-Content)のReadCountオプションで3行ずつパイプラインに渡してファイルに出力している


なお、上記のようにすっきりかけるようになるまでには以下のような変遷を経てる

一番最初

良く分からないのでファイルをエディタで開いたときの行番号表示から、ファイル数を別途計算し、その上でマジックナンバーを多用しつつGet-Contentの行数指定で愚直に切り出す。

0..3 | %{ (cat .\test.txt)[($_ * 3)..($_ * 3 +2)] > test$_.txt}

行数ぐらいPowershellで計算できるだろと思い至り、$lines行づつ分けたときのファイル数をまず出してからGet-Contentを使って毎度指定行を読み込んでファイル出力してる

$lines = 3
$maxCount=[Math]::Ceiling($(cat .\test.txt | measure).count / $lines) - 1 
0..$maxCount | %{ (cat .\test.txt)[($_ * $lines)..($_ *$lines +2)] > test$_.txt}

ReadCountオプションは便利ですね。