GNU parallel

シェルの作業を並列化したいときにparallelが便利らしい。&のみで何百も並列するとload averageがやばいことになっていってやがて落ちる。例えばたくさんのvcfファイルに一度にvcftoolsをかけたい時などに使える。../vcfsにgz.vcfファイルをたくさん持っていて、これらをすべてvcftoolsでINFO(ACとする)を取り出して../INFOs/ディレクトリに収めたい場合
ls -l ../vcfs/ | gawk '{
  if($9!=""){printf("../vcfs/"$9" ");
  gsub(".vcf.gz", "", $9); printf("../INFOs/"$9"\n")};
}' > infile.txt
でスペース区切りで第一引数(入力ファイル名)、第二引数(出力ファイル名)を収めたinfile.txtを作成する。
これを第一引数に入力ファイル名を、第二引数に出力ファイル名をとるシェル関数vcf2infoに対して以下のように食わす
parallels --colsep' '  -a infile.txt vcf2info
いきなり実行するのに自信がなければ
parallels --colsep' '  -a infile.txt --dry-run vcf2info
とすれば実行されるスクリプトが表示される。
と思ったが、自作関数をparallelに投げるには環境変数(?)にエクスポート(??)する必要があるらしい。bashだと先に
export -f vcf2info
とすれば上記コマンドは実行されるがzshだと簡単にはできないそうです・・・。

このブログの人気の投稿

Inverse-normal transformation

SKAT

locuszoom