2017-02-22 27 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_' –