GNU parallel
シェルの作業を並列化したいときにparallelが便利らしい。&のみで何百も並列するとload averageがやばいことになっていってやがて落ちる。例えばたくさんのvcfファイルに一度にvcftoolsをかけたい時などに使える。
これを第一引数に入力ファイル名を、第二引数に出力ファイル名をとるシェル関数
と思ったが、自作関数をparallelに投げるには環境変数(?)にエクスポート(??)する必要があるらしい。bashだと先に
../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だと簡単にはできないそうです・・・。