it-swarm.cn

如何将目录中的所有(文本)文件合并为一个?

我有14个文件全部都是一个文本的一部分。我想将它们合并为一个。怎么做?

99
Ivan

从技术上讲,这是cat(“连接”)应该执行的操作,即使大多数人只是将其用于将文件输出到stdout。如果给它多个文件名,它将按顺序输出所有文件名,然后可以将其重定向到一个新文件中。对于所有文件,只需使用* (要么 /path/to/directory/*(如果您还不在目录中),Shell会将其扩展为所有文件名

$ cat * > merged-file
182
Michael Mrozek

如果文件不在同一目录中,则可以在串联之前使用find命令:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

当文件已经订购并且想要合并它们以进行分析时,此功能非常有用。


更便携:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

这可能会或可能不会保留文件顺序。

27
3nrique0

命令

$ cat * > merged-file

实际上具有在合并中包含“合并文件”并创建失控文件的不良副作用。为了解决这个问题,可以将合并后的文件写入另一个目录。

$ cat * > ../merged-file

或使用模式匹配将忽略合并的文件;

$ cat *.txt > merged-file
10
Christopher Jones

就像这里的其他人一样...您可以使用cat

假设您有:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

而你只想要file01file03fileAfileC

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file

或者,使用括号扩展:

cat ~/file0{1..3} ~/file{A..C} > merged-file

或者,使用大括号扩展:

cat ~/file{0{1..3},{A..C}} > merged-file

或者,您可以使用for循环:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
10
Florin Idita

您可以指定文件的pattern,然后按以下步骤合并所有文件:

cat *pattern* >> mergedfile
0
user182845

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
0
Harini