2017-02-22 69 views
0

我想自動化拆分大gzip文件到更小的文件gzip文件每個拆分包含10000000行(最後拆分將剩下,將少於10000000)的過程。拆分大gzip文件,同時添加標題行到每個拆分

下面是我現在正在做的事情,我實際上是通過計算剩餘行數來重複。

gunzip -c large_gzip_file.txt.gz | tail -n +10000001 | head -n 10000000 > split1_.txt 
gzip split1_.txt 

gunzip -c large_gzip_file.txt.gz | tail -n +20000001 | head -n 10000000 > split2_.txt 
gzip split2_.txt 

我繼續通過重複所示的方式直到結束。然後我打開這些並手動添加標題行。這如何實現自動化?

我在網上搜索我看到awk和其他解決方案,但沒有看到gzip或類似於這種情況。

回答

1

我想接近它是這樣的:

  1. gunzip文件
  2. 使用head獲得第一行,並保存它關到另一個文件
  3. 使用tail獲取文件和管道的其餘部分它split生產1000萬行,每行
  4. 使用文件插入頭到每個文件中,或者只是貓的頭與每個文件
  5. gzip的每個文件

你會想在腳本或函數來包裝這使其更容易在重新運行晚點。下面是一個企圖在一個解決方案,輕輕測試:

#!/bin/bash 

set -euo pipefail 

LINES=10000000 

file=$(basename $1 .gz) 

gunzip -k ${file}.gz 
head -n 1 $file >header.txt 
tail -n +2 $file | split -l $LINES - ${file}.part. 
rm -f $file 

for part in ${file}.part.* ; do 
    [[ $part == *.gz ]] && continue # ignore partial results of previous runs 

    gzip -c header.txt $part >${part}.gz 

    rm -f $part 
done 

rm -f header.txt 

要使用:

$ ./splitter.sh large_gzip_file.txt.gz 

我將進一步通過使用中間文件的臨時目錄(mktemp -d),並確保提高該腳本清理本身在退出後(與trap)。理想情況下,它也會理智地檢查參數,可能會接受第二個參數,指示每個零件的行數,並檢查當前目錄的內容以確保它不會破壞任何先前存在的文件。

+0

假設我把這個放在x.sh文件中。執行時我可以做參數嗎?這也可能是這樣的例子。謝謝 –

+0

你想要什麼論據?如果這些都是你需要的,那麼shell腳本的StackOverflow就會有很多接受參數的例子。 – mwp

1

我不認爲awk是用於將gzip文件拆分成更小的文件,它用於文本處理。下面是我的方式來解決你的問題,希望它有助於:

第一步:

gunzip -c large_gzip_file.txt.gz | split -l 10000000 - split_file_ 

split命令文件分割成塊,你可以指定每個片的大小,也爲提供前綴所有的作品。

大gzip文件將被splited到多個文件名前綴split_file_

第二步

保存頭內容轉換成文件header_file.csv

第三步:

for f in split_file*; do 
    cat header_file.csv $f > $f.new 
    mv $f.new $f 
done 

我在這裏如果不是,請在拆分的文件目錄中工作,用絕對路徑替換split_file*,例如/path/to/split_file*。迭代與名稱模式split_file*的所有文件,添加標題內容,每場比賽文件的開頭

+0

第一步做的工作說法非文件或目錄 –

+0

@Null-Hypothesis如果在文件的同一目錄下執行該命令 – haifzhan

+0

,則將'large_gzip_file.txt.gz'替換爲真正的gzip文件名稱,它的抱怨是' split_file_'新文件名'gunzip -c large_gzip_file.txt.gz | split -l 10000000 split_file_' –