Ответы:
Технически это то, что cat
(«сцепление») должно делать, хотя большинство людей просто используют его для вывода файлов на стандартный вывод. Если вы дадите ему несколько имен файлов, он выведет их все последовательно, а затем вы сможете перенаправить их в новый файл; в случае всех файлов просто используйте *
(или /path/to/directory/*
если вы уже не в каталоге), и ваша оболочка расширит его до всех имен файлов
$ 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"
, так как оболочка будет затем передать литерал *
в find
.
Команда
$ cat * > merged-file
фактически имеет нежелательный побочный эффект включения 'объединенного-файла' в конкатенацию, создавая файл-разборщик. Чтобы обойти это, либо напишите объединенный файл в другой каталог;
$ cat * > ../merged-file
или используйте сопоставление с образцом, которое будет игнорировать объединенный файл;
$ cat *.txt > merged-file
cat * > merged-file
работает отлично. Глобы обрабатываются до создания файла. Если он 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]
не будет работать в качестве шаблона сглаживания.
Вы можете указать pattern
файл, а затем объединить их все следующим образом:
cat *pattern* >> mergedfile
Другой вариант - это 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 *
если ты не уверен.