SSDには約500GBの空きディスク容量があります。 10個のgzipファイル(それぞれ約25GBのサイズ)に対してジョブを実行しようとしています。ただし、forループでこれを行うと、多くのエントリがparallel
同じディレクトリに書き込まれ、それ自体がクリーンアップされないため、ストレージ容量が不足します。sort
temporary files
このファイルから任意の行数を取得しようとしています。
bcftools view "${FILES[i]}".vcf.gz | awk '{printf("%f\t%s\n",rand(),$0);}' | sort -t $'\t' -T . -k1,1g | head -n "${SUBSET_COUNT[i]}" | cut -f 2- >> "${FILES[i]}"_"${SUBSET_COUNT[i]}"_subset.vcf &
これはファイルごとに約1時間かかりますが(連続して実行する場合)、そのファイルのより多くのバッチに対して繰り返す必要があるため、並行して実行したいと思います。
答え1
私はなぜこのアプローチをとるのか本当に理解していません。rand()
再初期化されず、おそらく常に正確に同じ出力を提供するので、とにかく動作しないと思います。試してみてください:
$ for i in {1..10}; do awk -v i=$i 'BEGIN{print "Try "i",rand="rand()}'; done
Try 1,rand=0.924046
Try 2,rand=0.924046
Try 3,rand=0.924046
Try 4,rand=0.924046
Try 5,rand=0.924046
Try 6,rand=0.924046
Try 7,rand=0.924046
Try 8,rand=0.924046
Try 9,rand=0.924046
Try 10,rand=0.924046
とにかくすべてが複雑すぎるようです。以下を使用できますshuf
。
bcftools view file.vcf.gz | shuf -n 100 > newfile.vcf
これにより、入力から100行がランダムに選択されます。もちろん、これは有効なVCFファイルではなく、ヘッダが必要です。したがって、有効なVCFを生成するには、各ファイルにヘッダーを追加してから、ヘッダーではなくN行をランダムに選択します。
zgrep '^#' file.vcf.gz > newfile.vcf &&
zgrep -v '^#' file.vcf.gz | shuf -n 100 >> newfile.vcf
あるいは、圧縮されていないテキストを書かない方が良いでしょう。
zgrep '^#' file.vcf.gz | bgzip > newfile.vcf.gz &&
zgrep -v '^#' file.vcf.gz | shuf -n 100 | bgzip >> newfile.vcf.gz