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

#1 楼

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

评论


请注意,如果引用的命令编号的方式使外壳按“自然”顺序扩展*,则引用的命令可能只会执行发布者想要的操作。如果您有“ file1.txt ... file9.txt ... file14.txt”,则该文件将不起作用,因为file1?.txt将在file1.txt和file2.txt之间进行排序。您必须将它们重命名为“ file01.txt ... file09.txt ... file14.txt”。如果不确定,请说回声*。

–沃伦·杨(Warren Young)
2010年11月4日在21:43

@Warren:好点(或者您可以使用zsh并设置其numeric_glob_sort选项)。

–吉尔斯'所以-不再是邪恶的'
2010年11月4日23:04

@ warren-young正确,有用的警告评论。但是在我的实际情况下,顺序没有什么区别(因为文件只包含简单的SQL语句,插入没有依赖性的数据记录)。

–伊凡
2010年11月4日23:16



请注意,如果文件数超过一定限制,则可能会在-/ bin / cat:参数列表过长等错误中运行

– Nupur
2015年8月5日13:46

@ ARA1307仅当文件已存在时;否则,将在外壳程序打开文件写入文件之前将glob扩展。不过在那种情况下很好

– Michael Mrozek
18-09-20在3:45

#2 楼

如果文件不在同一目录中,则可以在串联之前使用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


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

评论


如果您有很多文件,这是一种方法。您可以避免出现“参数列表过长”的错误。

–马修·特纳(Matthew Turner)
2014年5月15日23:17

您需要-name“ * .csv”而不是-name * .csv-如果没有引号,它将失败。

– Peteris
16年8月16日在14:15

引号的需要取决于find命令的版本,特别是在find和awk中,当您使用Mac时,这是一个问题,这两个程序的版本都有些旧。到目前为止,在ubuntu,fedora,debian和CentOS上,它工作顺利,没有引号

– 3nrique0
16 Sep 15'在12:08

我希望当当前目录中没有匹配模式“ * .csv”的文件时,无引号的版本能够正常工作,因为外壳程序随后将传递文字*进行查找。

– RJHunter
16年11月18日在5:47

请参阅为什么遍历find的输出是错误的做法?

–通配符
16年11月18日在6:57

#3 楼

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

假设您拥有:

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


而您只想要file01 file03fileAfileC

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


评论


请注意,字符串[01-03]不能用作通配模式。

– Kusalananda♦
16年8月3日在10:13

#4 楼

实际上,命令

$ cat * > merged-file


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

$ cat * > ../merged-file


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

$ cat *.txt > merged-file


评论


cat *>合并文件工作正常。在创建文件之前先处理globs。如果合并文件已经存在,cat(至少我的猫)将检测到它是输出文件,并拒绝读取它。如果文件已经存在,并且您稍后在管道中进行了重定向,那么显然它无法做到这一点,因此只有这样,您才能获得失控的文件。

–凯文
2012年2月21日在22:48

cat无法检测文件是否为输出文件。重定向发生在外壳中;猫只在标准输出上打印。

–bfontaine
17年9月11日在18:48

#5 楼

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

cat *pattern* >> mergedfile


#6 楼

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(不合并)。文本文件!)。您可以使用w“ merge.txt”避免与文件名混淆,而-n表示无提示输出。

当然,您也可以使用通配符来缩短文件列表。例如,对于如上述示例中带有编号文件的文件,可以使用大括号指定范围,方法是:

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