2012-12-07 118 views
1

我想將大型壓縮的CSV文件分割成多個較小的gzip文件,在線邊界上分割。有沒有一種有效的方法來讀取bash中的行輸入?

我試圖用一段時間讀管道gunzip到一個bash腳本讀LINE。該腳本寫入到後臺gzip進程正在重新壓縮的命名管道中。每隔X個字符讀取一次,我關閉FD併爲下一個分割重新開始一個新的gzip過程。

但是在這種情況下,腳本在讀取LINE時佔用了90%的CPU,因爲在這裏讀取效率非常低(我知道它使系統調用一次讀取1個字符)。

有關這樣做的任何想法?我希望gzip消耗大多數cpu。

回答

2

使用split-l選項指定您想要的行數。使用--filter選項$FILE是名分裂會用於輸出到文件(並已與引號標註,以防止外殼太早擴張:

zcat doc.gz | split -l 1000 --filter='gzip > $FILE.gz' 

如果您需要任何額外的處理,只是筆的腳本,將接受文件名作爲參數相應的工藝和標準輸入,並用它來代替普通的gzip

+0

我寧願這樣做,沒有大量寫入磁盤的分割需要。這些是巨大的文件。 –

+0

重新壓縮後,我還有一個捲曲上傳步驟。因此,按照拆分程序 –

+0

@DavidParks查看更新後的答案會更有效率。 – peterph

0

如何使用與-l選項split命令?

gzcat large.csv.gz | split -l 1000 - xxx 
gzip xxx* 
+0

試圖避免進入磁盤,以便在內聯重新壓縮後上傳 –

相關問題