Відповіді:
Це технічно те, що cat
("конкатенат") повинен робити, хоча більшість людей просто використовують його для виведення файлів у stdout. Якщо ви дасте йому кілька імен файлів, вони видадуть їх усі послідовно, а потім ви можете перенаправити це в новий файл; у випадку, якщо всі файли просто використовуйте *
(або /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
тільки відбитки на stdout.
Як і інші звідси кажуть ... Можна використовувати 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 *
якщо ви не впевнені.