使用for
循环,我可以合并以*.txt
结尾的目录中的所有文件:
for filename in *.txt; do
cat "${filename}"
echo
done > output.txt
执行此操作后,我将通过各种脚本运行output.txt
,其中文本将发生相当大的变化。之后,我想将文件在合并它们的相同位置拆分为不同的文件(output01.txt
,output02.txt
等。)。
这不能基于行号,因为脚本会在地方添加\。
我认为可行的解决方案是在合并它们之前在每个初始*.txt
文件的末尾放置“@@@@@@@@@”,但我不知道如何获取BASH
以在该标记处再次拆分文件。
答案 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
拆分合并的文件。