2011-12-18 79 views
1

使用for环,我可以合并所有的目录,与*.txt结尾的文件中:合并,然后切割文件

for filename in *.txt; do 
    cat "${filename}" 
    echo 
done > output.txt 

这样做后,我将通过各种脚本运行output.txt,其中文字会有相当大的改变。在那之后,我想分割的文件,在它们合并成不同的文件(output01.txtoutput02.txt等)相同的地方。

  • 如何在合并的地方拆分文件?

这不能根据行号,因为脚本将在地方添加\吨。

我认为这可能工作的解决方案是将“@@@@@@@@@”在每一个将它们合并前的初始*.txt文件的结束,但我不知道怎么去BASH到在该标记处再次分割文件。

+2

串联文件的更简单的方法:'猫* .TXT> output.txt'。 – choroba 2011-12-18 00:07:12

+0

运行在分割文件的脚本,个别。 – 2011-12-18 16:46:44

回答

2

而不是for回路串联的,你可以只使用cat *.txt

无论如何,你为什么不只是独立的内循环for执行上的每个文件的脚本?

如果你真的想结合,重新分离,您可以使用:

for filename in *.txt; do 
    cat "${filename}" 
    echo "@@@@@" 
done > output.txt 

# Pass output.txt through whatever 

awk 'BEGIN { fileno = 1; file = sprintf("output%02d.txt", fileno) }; 
    { if($1 ~ /@@@@@/) { fileno++; 
          file = sprintf("output%02d.txt", fileno); 
          next } 
     else print >file 
    }' output.txt 
1

的规范的答案是:

tar c *.txt > output.txt 

你可能分裂/取消合并正是通过做

tar xf output.txt # in the current directory 
tar x -C /tmp/splitfiles/ -f output.txt 

现在,如果你真的想要做的东西一样,在一个循环,并提取到stdout /管道,你可以:

while read fname < <(tar tf output.txt) 
do 
    # extract named to pipe 
    tar -xOf output.txt "$fname" | myprogram "$fname" 
done 

但是,这可能不是非常有效。你可以考虑只是做

while read fname < <(tar x -v -C /tmp/splitfiles/ -f output.txt) 
do 
    # handle extracted file 
    myprogram "/tmp/splitfiles/$fname" 
    unlink "/tmp/splitfiles/$fname" # drop the temp file 
done 

这将是完全异步的(所以如果提取或存档的连传输速度慢,第一个文件已经可以处理,同时等待更多的数据到达)。

也看到我的其他答案https://stackoverflow.com/a/8341221/85371(寻找older answer一部分,因为这个问题被改为非常具体版本)

1

正如弗雷德里克写道here可以使用csplit拆分已合并的文件。