使用for
循环,我可以合并以*.txt
结尾的目录中的所有文件。
for filename in *.txt; do
cat "${filename}"
echo
done > output.txt
完成此操作后,我将通过各种脚本运行output.txt
,在这些脚本中,文本将发生很大的变化。在此之后,我希望将文件分割到不同的文件(output01.txt
、output02.txt
等)中,并将它们合并在合并的位置。
这不能基于行号,因为脚本将在某些地方添加\t。
我认为一个可能有效的解决方案是在每个初始*.txt
文件的末尾放置“@”,然后再将它们合并,但我不知道如何使BASH
在该标记处再次拆分这些文件。
发布于 2011-12-18 00:23:15
与用于连接的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
发布于 2011-12-18 01:23:09
典型的答案是:
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 (查找https://stackoverflow.com/a/8341221/85371部分,因为这个问题后来被更改为非常具体)。
发布于 2011-12-18 16:28:55
正如Fredrik所写的here,您可以使用csplit
来拆分合并的文件。
https://stackoverflow.com/questions/8548882
复制相似问题