dos行の終わりを持つ120個の.gzファイル(それぞれ約5G)があり、私の目標はこれをUnix行の終わりに変換することですが、数日待つことはありません。
これが私の現在のアプローチです。
function conv() {
tmpfile=$(mktemp .XXXXXX)
zcat $1 > $tmpfile
dos2unix $tmpfile
gzip $tmpfile
mv $tmpfile.gz $1
}
for a in $(ls *.fastq.gz); do
echo "$a"
conv "$a" &
done
解凍して再圧縮せずに行末を修正する方法はありますか?
答え1
とにかく解凍して圧縮する必要があります。しかし、すべての段階で結果を保存する必要はありません。だから:
set -o noclobber
for file in *.fastq.gz; do
gzip -d < "$file" | dos2unix | pigz > "$file.new" &&
mv -- "$file.new" "$file"
done
圧縮には一度に多くのプロセッサを使用してくださいpigz
。
GNU xargs
'を使用して、-P
これらのパイプラインのいくつかを並列に実行することもできます。
printf '%s\0' *.fastq.gz |
xargs -r0 -P4 -n1 sh -o noclobber -c '
gzip -d < "$1" | dos2unix | gzip > "$1.new" &&
mv -- "$1.new" "$1"' sh
ここでは4つを並列に実行します。gzip -d
、dos2unix
およびはすでにgzip
各パイプラインで並列に実行されています(gzip
パイプラインのボトルネックが発生する可能性があります)。 CPU 数を超える並列実行数がパフォーマンスを低下させる可能性があります。 CPUが高速またはストレージが遅い場合、I / Oはボトルネックを引き起こし、複数のCPUを並列に実行すると実際にパフォーマンスが低下することがわかります。
再圧縮するときは、より高速で圧縮したり、独立したチャンクからランダムにデータにアクセスしたり、より高速に解凍したりするなど、ニーズに合った他の圧縮アルゴリズムに切り替えることができます。