Linux 如何在连接之前插入新行?
我有大约80000个文件,我正在尝试连接它们。这个:Linux 如何在连接之前插入新行?,linux,file,unix,command-line,ubuntu,Linux,File,Unix,Command Line,Ubuntu,我有大约80000个文件,我正在尝试连接它们。这个: cat files_*.raw >> All 速度非常快,但是: for f in `ls files_*.raw`; do cat $f >> All; done; 速度非常慢。由于这个原因,我试图坚持使用第一个选项,除了我需要能够在每个文件连接到All后插入新行。有什么快速的方法可以做到这一点吗?我不知道为什么会很慢,但我认为您没有太多选择: for f in `ls files_*.raw`; do cat
cat files_*.raw >> All
速度非常快,但是:
for f in `ls files_*.raw`; do cat $f >> All; done;
速度非常慢。由于这个原因,我试图坚持使用第一个选项,除了我需要能够在每个文件连接到
All
后插入新行。有什么快速的方法可以做到这一点吗?我不知道为什么会很慢,但我认为您没有太多选择:
for f in `ls files_*.raw`; do cat $f >> All; echo '' >> All; done
那怎么办
ls files_*.raw | xargs -L1 sed -e '$s/$/\n/' >>ALL
这将在每个文件的末尾插入一个额外的换行符
如果您不关心连接的顺序,可以使用并行版本:
find ./ -name "*.raw" -print | xargs -n1 -P4 sed -e '$s/$/\n/' >>All
第二个命令可能很慢,因为在第一个命令中,您打开“All”文件的append次数是80000次,而在第一个命令中是1次。尝试第二个命令的简单变体:
for f in `ls files_*.raw`; do cat $f ; echo '' ; done >> All
每次awk打开另一个文件进行处理时,FRN等于0,因此:
awk '(0==FRN){print ""} {print}' files_*.raw >> All
注意,这一切都是在一个awk过程中完成的。性能应该接近问题中的cat命令。如果您真的想使用这样的for循环(它对可以处理的文件数量有限制),那么至少要去掉
ls
,并确保引用您的文件名,因此:for f in files.*.raw;做猫“$f”;回声';完成>>所有
+1感谢您的努力,但我已经有了这个版本,但正如Soren提到的,我必须避免使用for循环中的ls
。太棒了!工作完美。为了以防万一,我还添加了一个并行版本。谢谢。请小心对其进行分析,因为您的输出将混合在所有文件中--不确定您是否关心这一点。实际上,这应该没问题,因为我正在提取有关单个文件的一些统计信息,在这种情况下,顺序并不重要。在一个不相关的案例中,我不知道为什么答案没有评论就被否决了+我的回答很好,可惜我不能再做一次来弥补这次神秘的否决票。Downvoter-请评论@图例-您的并行版本:如果要使用find | xargs
,您应该(几乎?)始终使用NUL终止选项find-print0 | xargs-0..
这样,如果有任何文件或目录的名称中有空格,您就不会中断。时间是+1。正如我在其他评论中提到的,我试图避免for循环。