合并,然后拆分文件

时间:2011-12-18 00:04:33

标签: bash

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

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

执行此操作后,我将通过各种脚本运行output.txt,其中文本将发生相当大的变化。之后,我想将文件在合并它们的相同位置拆分为不同的文件(output01.txtoutput02.txt等。)。

  • 如何将文件拆分到合并的位置?

这不能基于行号,因为脚本会在地方添加\。

我认为可行的解决方案是在合并它们之前在每个初始*.txt文件的末尾放置“@@@@@@@@@”,但我不知道如何获取BASH以在该标记处再次拆分文件。

3 个答案:

答案 0 :(得分: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 :(得分: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 部分,因为该问题后来更改为非常具体)

答案 2 :(得分:1)

当Fredrik写here时,您可以使用csplit拆分合并的文件。