Gzip

更快地轉換 .gz 壓縮文件中的 dos 行結尾

  • September 15, 2022

我有 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 -ddos2unixgzip在每個管道中已經並行執行(gzip可能是管道的瓶頸)。並行執行多於 CPU 可能會降低性能。如果您有快速 CPU 和/或慢速儲存,您可能還會發現 I/O 是瓶頸,並且並行執行多個實際上已經降低了性能。

在重新壓縮時,這可能是切換到更適合您的需求的不同壓縮算法的好機會,例如一些壓縮得更好或更快的算法,或者讓您在獨立塊中隨機訪問數據或更快地解壓縮……

引用自:https://unix.stackexchange.com/questions/717376