Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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
Linux 连接文件并在文件之间插入新行_Linux_Unix_Cat - Fatal编程技术网

Linux 连接文件并在文件之间插入新行

Linux 连接文件并在文件之间插入新行,linux,unix,cat,Linux,Unix,Cat,我有多个文件要用cat处理。 比方说 File1.txt foo File2.txt bar File3.txt qux 我希望合并,以便最终文件如下所示: foo bar qux 而不是使用通常的cat File*.txt>finalfile.txt foo bar qux 正确的方法是什么?您可以: for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done awk 'FNR==1{print ""

我有多个文件要用
cat
处理。 比方说

File1.txt 
foo

File2.txt
bar

File3.txt
qux
我希望合并,以便最终文件如下所示:

foo

bar

qux
而不是使用通常的
cat File*.txt>finalfile.txt

foo
bar 
qux
正确的方法是什么?

您可以:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done
awk 'FNR==1{print ""}1' *.txt > finalfile.txt
在运行上述命令之前,请确保文件
finalfile.txt
不存在

如果允许您使用
awk
您可以:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done
awk 'FNR==1{print ""}1' *.txt > finalfile.txt

如果是我,我会使用sed:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt
在这个sed模式中,$有两种含义,首先它只匹配最后一个行号(作为应用模式的行范围),其次它匹配替换模式中的行尾

如果您的sed版本没有
-s
(单独处理输入文件),您可以将其作为一个循环来完成:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

如果可以列出每个文件的文件足够少,则可以在Bash中使用,在每对文件之间插入换行符:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

cat File1.txt我就是这样在OsX 10.10.3上完成的

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done
因为没有参数的简单“echo”命令没有插入新行。

这在Bash中有效:

for f in *.txt; do cat $f; echo; done
与带有
>
(append)的答案不同,此命令的输出可以通过管道传输到其他程序

示例:

  • 文件*.txt中f的
    ;做猫$f;回声;完成>finalfile.txt
  • (for…done)>finalfile.txt
    (选项可选)
  • 用于。。。完成| less
    (管道插入less)
  • 用于。。。完成| head-n-1
    (这会去掉后面的空行)

在python中,这将在文件之间连接空行(
禁止添加额外的尾随空行):

下面是丑陋的python one liner,它可以从shell调用并将输出打印到文件:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt

如果愿意,您可以使用
xargs
进行操作,但主要思想仍然是一样的:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

可能重复的
AWK'{print$0}'*.txt
这有一个明显的缺陷,即在末尾(第一个备选方案)或开头(第二个备选方案)将有空行。不过,您可以使用
awk'FNR==1&&NR>1…“
来轻松防范这种情况。如果将
>finalfile.txt
放在
完成后
可以覆盖而不是追加,这将删除在循环之前确保文件丢失或为空的要求。或者在GNU sed中:
sed-s'$G'*.txt>finalfile.txt
仅一个流!这应该是公认的答案!伙计们,小心点,我刚才撞坏了我的电脑,因为我用了
find
代替了
*.txt
,这意味着文件被附加到了它本身!美丽的!谢谢。这对我的Letsencrypt证书创建.pem文件非常有效。我正在尝试在xargs中创建它,但失败了,有什么提示吗
..xargs-I{}kubectl-n alex exec{}--cat blah.log>blahblah.logs
cat:/dev/fd/63:没有这样的文件或目录,命令以退出代码终止1@tuxErrante我认为问题不在于xargs,而在于kubectl,它接受一个远程运行的命令,而
它在alpenshell上不起作用,但下面的代码确实起作用了,谢谢你的提示
sh-c“echo-e'\n\n'| cat-/../logs/a.log“
谢谢。我发现
xargs
比bash中的循环更容易使用;如何将其插入每个文件之间?