次のファイルがあります。
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
このファイルを2番目のフィールドの10000間隔(行ではなく数値間隔)ごとに分割したいと思います。したがって、このファイルの場合は、最初の行(61336212を含む行)から最大61346211(61336212 + 9999)を含む行に分割し、61346212から61356211まで分割したいと思います。ご覧のとおり、2番目のフィールド/列の数字は「塗りつぶされていません」です。
これを行う方法はありますか?
ベストアンサー1
awk 'NR==1 {n=$2}
{
file = sprintf("file.%.4d", ($2-n)/10000)
if (file != last_file) {
close(last_file)
last_file = file
}
print > file
}'
、...と書くでしょうfile.0000
(ここではfile.0001
数字は最初の行の数字です)。int(($2-n)/10000)
n
$2
ファイルの書き込みを停止するとすぐにファイルを閉じます。そうしないと、何百ものファイルの後に同時に開くファイル数の制限に達します(GNUはawk
この制限を解決できますが、パフォーマンスは急速に低下します)。
我々はこの数が常に増加すると仮定します。