Answers:
从技术上讲,这cat
是应该做的(“连接”),即使大多数人只是将其用于将文件输出到stdout。如果给它多个文件名,它将按顺序输出所有文件名,然后可以将其重定向到一个新文件中。在所有文件都使用的情况下*
(或者/path/to/directory/*
如果您不在目录中),您的shell会将其扩展为所有文件名
$ cat * > merged-file
numeric_glob_sort
选项)。
如果文件不在同一目录中,则可以在串联之前使用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
这可能会或可能不会保留文件顺序。
"*.csv"
,因为shell随后会将文字传递*
给find
。
命令
$ cat * > merged-file
实际上具有在合并中包含“合并文件”并创建失控文件的不良副作用。为了解决这个问题,可以将合并后的文件写入另一个目录。
$ cat * > ../merged-file
或使用模式匹配将忽略合并的文件;
$ cat *.txt > merged-file
cat * > merged-file
工作正常。在创建文件之前先处理globs。如果merged-file
已经存在,cat
(至少是我的)将检测到它是输出文件,并拒绝读取它。如果文件已经存在,并且您稍后在管道中进行了重定向,那么显然它无法做到这一点,因此只有这样,您才能获得失控的文件。
cat
无法检测文件是否为输出文件。重定向发生在外壳中;cat
仅在标准输出上打印。
就像这里的其他人一样...您可以使用 cat
假设您有:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
而您只file01
想要file03
和fileA
要fileC
:
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]
不能用作全局模式。
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
*
以“自然”顺序扩展,则引用的命令可能只会执行发布者想要的操作。如果您有“ file1.txt ... file9.txt ... file14.txt”,则该文件将不起作用,因为file1?.txt将在file1.txt和file2.txt之间进行排序。您必须将它们重命名为“ file01.txt ... file09.txt ... file14.txt”。再说echo *
,如果你还不能肯定。