2013-08-01 36 views
90

我想将五个文件的内容按原样复制到一个文件中。我尝试使用cp为每个文件。但是这会覆盖从前一个文件复制的内容。我也试过如何将多个文件的内容添加到一个文件中

paste -d "\n" 1.txt 0.txt 

它没有工作。

我希望我的脚本在每个文本文件的末尾添加换行符。

例如。文件1.txt,2.txt,3.txt。把内容1,2,3放在0.txt中

我该怎么做?

+1

可能重复在之间的文件](http://stackoverflow.com/questions/8183191/concatenating-files-and-insert-new-line-in-between-files) –

+0

另一个答案在这里:http://stackoverflow.com/questions/ 2576693/linux-merge-multiple-files-each-on-a-new-line –

回答

183

您需要cat(concatenate的简写)命令,与shell重定向(>)到您的输出文件

cat 1.txt 2.txt 3.txt > 0.txt 
+6

应该是>>对吧?以及为什么在我的0.txt文件中的所有文本之前有一个换行符? – Steam

+0

你想保留0.txt的内容吗? – sehe

+7

@blasto它取决于。您可以使用'>>'将另一个文件_append_放入另一个文件中,其中'>'用输入文件覆盖输出文件。至于换行符,是否有一个换行符作为文件“1.txt”中的第一个字符?你可以通过使用'od -c'来看看,看看第一个字符是否是'\ n'。 – radical7

55

另一种选择,对于那些你们谁仍然偶然发现这个职位和我一样,是使用find -exec

find . -type f -name '*.txt' -exec cat {} + >> output.file 

就我而言,我需要一个更强大的选项,会去翻多个子目录,所以我选择使用find。分解:

find . 

查看当前工作目录。

-type f 

只有文件,而不是目录兴趣等

-name '*.txt' 

削减的结果通过名称

-exec cat {} + 

设置每个结果执行cat命令。 “+”是指仅cat 1个实例催生(THX @gniourf_gniourf)

>> output.file 

在其他的答案所解释的,猫-ED内容附加到一个输出文件的结尾。

+4

答案有很多缺点。首先,必须引用通配符“* .txt”(否则,写入的整个'find'命令是无用的)。另一个缺陷来自严重的误解:执行的命令_is not_'cat >> 0.txt {}',但是'cat {}'。你的命令实际上相当于'{find。 -type f -name * .txt -exec cat'{}'\; ; } >> 0.txt'(我添加了分组,以便您意识到真正发生了什么)。另一个缺陷是'find'将会找到'0.txt'文件,'cat'会通过说_input文件输出file_来发出抱怨。 –

+0

感谢您的更正。我的情况有点不同,我没有想到应用于这种情况的一些陷阱。 – mopo922

+0

你应该把'output.file'放在你的命令的最后,这样你就不会诱使任何人(包括你自己)认为'find'会为每一个执行'cat {} >> output.file'找到文件。 –

31

,如果你有一定的输出类型,然后做这样的事情

cat /path/to/files/*.txt >> finalout.txt 
12

如果您所有的文件在单一的目录,你可以简单地做

cat * > 0.txt

文件1.txt的,2 .txt,..将进入0.txt

1

如果要将3个文件的内容附加到一个文件中,那么以下命令将是一个不错的选择:

cat file1 file2 file3 | tee -a file4 > /dev/null 

将所有文件的内容合并到文件4,控制台输出投掷到/dev/null

8
for i in {1..3}; do cat "$i.txt" >> 0.txt; done 

我找到了这个页面,因为我需要将952个文件合并为一个。如果你有很多文件,我发现这会更好。这将为您需要的许多数字执行循环,并使用>>将每个数字添加到0.txt的末尾。

+0

你可以在bash中使用括号扩展来写cat {1, 2,3} .txt >> 0.txt – mcheema

1

如果原始文件包含不可打印的字符,则在使用cat命令时它们会丢失。使用'cat -v',非printables将被转换为可见的字符串,但输出文件仍然不包含原始文件中的实际非printables字符。对于少量文件,另一种方法可能是在处理非打印字符的编辑器(例如vim)中打开第一个文件。然后操作到文件底部并输入“:r second_file_name”。这将拉第二个文件,包括非打印字符。对于其他文件也可以做同样的事情。当所有文件都被读入时,输入“:w”。最终的结果是,第一个文件现在包含它的所作所为本来,再加上被读取的文件的内容

4

另一种选择是sed

sed r 1.txt 2.txt 3.txt > merge.txt 

或者......

sed h 1.txt 2.txt 3.txt > merge.txt 

或者......

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here 

或者不进行重新定向...

sed wmerge.txt 1.txt 2.txt 3.txt 

注意,最后一行写也merge.txt(不wmerge.txt!)。您可以使用w"merge.txt"以避免与文件名称混淆,并使用-n进行无提示输出。

当然,你也可以用通配符缩短文件列表。例如,在编号的文件,在上述例子中的情况下,你可以用这种方式括号指定范围:

sed -n w"merge.txt" {1..3}.txt 
1

如果你的文件包含,你想删除它们在输出文件,你可以使用:

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done 
2

如果您的所有文件的名称相似,你可以简单地做:合并文件并插入新线的

cat *.log >> output.log 
相关问题