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

nev*_*int 109 unix linux cat

我有多个文件,我想连接cat.让我们说吧

File1.txt 
foo

File2.txt
bar

File3.txt
qux
Run Code Online (Sandbox Code Playgroud)

我想连接,以便最终文件看起来像:

foo

bar

qux
Run Code Online (Sandbox Code Playgroud)

而不是平常 cat File*.txt > finalfile.txt

foo
bar 
qux
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

cod*_*ict 102

你可以做:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done
Run Code Online (Sandbox Code Playgroud)

finalfile.txt运行上述命令之前,请确保该文件不存在.

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

awk 'FNR==1{print ""}1' *.txt > finalfile.txt
Run Code Online (Sandbox Code Playgroud)

  • `AWK'{print $ 0}'*.txt` (8认同)
  • 这具有明显的缺陷,即在最后(从第一替代方案)或在开始(第二替代方案)中将存在空行.你可以用'awk'FNR == 1 && NR> 1来轻松防范这种情况. (6认同)
  • 如果在`done`之后放置`> finalfile.txt`,你可以覆盖而不是append,这将删除在循环之前确保文件丢失或为空的要求. (4认同)
  • 受到 @timger 的启发,`awk '1' *.txt` :smile: (2认同)

RTS*_*lio 41

如果您有足够的文件可以列出每个文件,那么您可以在Bash中使用进程替换,在每对文件之间插入换行符:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt
Run Code Online (Sandbox Code Playgroud)

  • 美丽的!谢谢。 (2认同)

Fle*_*exo 33

如果是我这样做我会使用sed:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt
Run Code Online (Sandbox Code Playgroud)

在这个sed模式中,$有两个含义,首先它只匹配最后一个行号(作为应用模式的行的范围),其次它匹配替换模式中行的结尾.

如果您的sed版本没有-s(单独处理输入文件),您可以将其全部作为循环执行:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt
Run Code Online (Sandbox Code Playgroud)

  • 或者在GNU sed中:`sed -s'$ G'*.txt> finalfile.txt` (3认同)

Nic*_*Roz 9

xargs如果你愿意,你可以使用它,但主要想法仍然是相同的:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我发现 `xargs` 比 bash 中的循环更容易使用。 (3认同)

lbr*_*tti 7

这就是我在OsX 10.10.3上做到的

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done
Run Code Online (Sandbox Code Playgroud)

因为没有参数的简单'echo'命令最终没有插入新行.


use*_*389 7

这适用于Bash:

for f in *.txt; do cat $f; echo; done
Run Code Online (Sandbox Code Playgroud)

与使用>>(append)的答案相比,此命令的输出可以通过管道传输到其他程序中.

例子:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (parens是可选的)
  • for ... done | less (管道更少)
  • for ... done | head -n -1 (这剥去了尾随的空白行)


Wad*_* M. 6

您可以使用grep, with-h来不回显文件名

grep -h "" File*.txt
Run Code Online (Sandbox Code Playgroud)

会给:

foo
bar 
qux
Run Code Online (Sandbox Code Playgroud)