Gzip
更快地轉換 .gz 壓縮文件中的 dos 行結尾
我有 120 個帶有 dos 行結尾的 .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
有沒有辦法在不拆包和重新包裝的情況下修復行尾?
無論如何,您需要解壓縮和壓縮。但是您不需要在每一步都保存結果。所以:
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 是瓶頸,並且並行執行多個實際上已經降低了性能。在重新壓縮時,這可能是切換到更適合您的需求的不同壓縮算法的好機會,例如一些壓縮得更好或更快的算法,或者讓您在獨立塊中隨機訪問數據或更快地解壓縮……