Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在连接之前插入新行?_Linux_File_Unix_Command Line_Ubuntu - Fatal编程技术网

Linux 如何在连接之前插入新行?

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

我有大约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 $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循环。