it-swarm-ru.tech

Как объединить все (текстовые) файлы в каталоге в один?

У меня есть 14 файлов, которые являются частью одного текста. Я хотел бы объединить их в один. Как это сделать?

99
Ivan

Технически это то, что должен делать cat ("concatenate"), хотя большинство людей просто используют его для вывода файлов на стандартный вывод. Если вы дадите ему несколько имен файлов, он выведет их все последовательно, а затем вы сможете перенаправить их в новый файл; в случае всех файлов просто используйте * (или /path/to/directory/* если вы еще не в каталоге) и ваша оболочка расширит его до всех имен файлов

$ 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

И вы хотите только file01 до file03 и ​​fileA to 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
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