Linux объединяет файлы в один
Обновлено: 21.11.2024
Этот пост и этот сайт содержат партнерские ссылки. См. мое сообщение о партнерских ссылках.
сообщить об этом объявлении
Часто у вас может быть несколько файлов, которые необходимо объединить в один файл. Возможно, вы ранее разделили один файл на несколько файлов и хотите просто объединить их обратно, или у вас есть несколько файлов журналов, которые вы хотите объединить в один. Какой бы ни была причина, в Linux очень легко объединить несколько текстовых файлов в один файл.
Команда в Linux для объединения или слияния нескольких файлов в один файл называется cat. Команда cat по умолчанию объединяет и выводит несколько файлов на стандартный вывод. Вы можете перенаправить стандартный вывод в файл, используя оператор «>», чтобы сохранить вывод на диск или в файловую систему.
Еще одна полезная утилита для объединения файлов называется объединением, которая может объединять строки двух файлов на основе общих полей. Однако он может работать только с двумя файлами одновременно, и я нашел его довольно громоздким в использовании. В этом посте мы рассмотрим в основном команду cat.
Объединить несколько файлов в один по порядку
Команда cat принимает в качестве аргумента список имен файлов. Порядок, в котором имена файлов указываются в командной строке, определяет порядок, в котором файлы объединяются или объединяются. Итак, если у вас есть несколько файлов с именами file1.txt, file2.txt, file3.txt и т. д.…
bash$ cat файл1.txt файл2.txt файл3.txt файл4.txt > ./mergedfile.txt
Приведенная выше команда добавит содержимое file2.txt в конец file1.txt. Содержимое file3.txt добавляется в конец объединенного содержимого file1.txt и file2.txt и т. д.… и весь объединенный файл сохраняется с именем mergedfile.txt в текущем рабочем каталоге.
Часто у вас может быть чрезмерно большое количество файлов, что затрудняет ввод всех имен файлов. Команда cat принимает регулярные выражения в качестве имен входных файлов, что означает, что вы можете использовать их для уменьшения количества аргументов.
bash$ cat file*.txt my*.txt > mergedfile.txt
Это объединит все файлы в текущем каталоге, которые начинаются с имени file и имеют расширение txt, за которыми следуют файлы, начинающиеся с my< /em> и имеет расширение txt. Вы должны быть осторожны с использованием регулярных выражений, если хотите сохранить порядок файлов. Если вы ошибетесь в регулярном выражении, это повлияет на точный порядок объединения файлов.
Быстрый и простой способ убедиться, что файлы объединяются именно в том порядке, в котором вы хотите, – это использовать вывод другой программы для работы со списком файлов, такой как ls или find и передать его команде cat. Сначала выполните команду find с регулярным выражением и проверьте порядок файлов…
bash$ найти . -name "файл*.txt" -o -name "мой*.txt"
Это распечатает файлы в таком порядке, чтобы вы могли проверить их правильность или изменить в соответствии с вашими пожеланиями. Затем вы можете направить этот вывод в команду cat.
bash$ найти . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
При объединении нескольких файлов в один файл с использованием регулярных выражений для их сопоставления, особенно если он передается по конвейеру и выходной файл не очень очевиден, убедитесь, что регулярное выражение не соответствует имени объединенного файла. В случае совпадения команда cat обычно довольно хорошо выдает сообщение об ошибке «входной файл является выходным файлом». Но для начала полезно быть осторожным.
Объединить два файла в произвольном месте
Иногда вам может понадобиться объединить два файла, но в определенном месте в содержимом файла. Это больше похоже на процесс вставки содержимого одного файла в другой в определенной позиции в файле.
Если размеры файлов небольшие и управляемые, vi — отличный инструмент для редактирования. В противном случае можно сначала разделить файл, а затем объединить полученные файлы по порядку. Самый простой способ — разбить файл по номерам строк, именно туда, куда вы хотите вставить другой файл.
bash$ split -l 1234 file1.txt
Вы можете разделить файл на любое количество выходных файлов в зависимости от ваших требований. В приведенном выше примере файл file1.txt будет разделен на куски по 1234 строки. Вполне возможно, что у вас может получиться более двух файлов с именами xaa, xab, xac и т. д.Вы можете объединить все это обратно, используя ту же команду cat, что упоминалась ранее.
bash$ cat xaa file2.txt xa
Приведенная выше команда объединит файлы по порядку с содержимым file2.txt между содержимым xaa и xab.< /p>
Еще один вариант использования — это когда вам нужно объединить только определенные части определенных файлов в зависимости от некоторых условий. Это особенно полезно для меня, когда мне нужно проанализировать несколько больших файлов журнала, но меня интересуют только определенные сообщения или строки. Итак, мне нужно будет извлечь важные сообщения журнала на основе некоторых критериев из нескольких файлов журнала и сохранить их в другом файле, сохраняя при этом или сохраняя порядок сообщений.
Хотя вы можете сделать это с помощью команд cat и grep, вы также можете сделать это с помощью только команды grep.
bash$ grep -h "[Error]" logfile*.log > onlyerrors.log
Приведенный выше код извлечет все строки, соответствующие шаблону [Error], и сохранит их в другом файле. Вам нужно будет убедиться, что файлы журналов находятся в порядке при использовании регулярного выражения для их сопоставления, как упоминалось ранее в сообщении.
сообщить об этом объявлении
Я хочу, чтобы мой скрипт добавлял новую строку в конец каждого текстового файла.
например. Файлы 1.txt, 2.txt, 3.txt. Поместить содержимое 1,2,3 в 0.txt
12 ответов 12
Вам нужна команда cat (сокращение от concatenate) с перенаправлением оболочки ( > ) в выходной файл
@blasto это зависит от обстоятельств. Вы должны использовать >> для добавления одного файла к другому, где > перезаписывает выходной файл тем, что в него направлено. Что касается новой строки, есть ли новая строка в качестве первого символа в файле 1.txt? Вы можете узнать это, используя od -c и посмотрев, является ли первый символ \n .
@blasto Вы определенно движетесь в правильном направлении. Bash, безусловно, принимает форму <. > для сопоставления имен файлов, так что, возможно, кавычки немного испортили ваш сценарий? Я всегда стараюсь работать с такими вещами, используя ls в оболочке. Когда я правильно понимаю команду, я просто вырезаю и вставляю ее в скрипт как есть. Вам также может пригодиться параметр -x в ваших сценариях — он будет отображать расширенные команды в сценарии перед выполнением.
Возможно, чтобы кто-то не совершил ту же ошибку: cat 1.txt 2.txt > 1.txt просто переопределит 1.txt содержимым 2.txt . Он не объединяет два файла в первый.
Еще один вариант для тех из вас, кто все еще наткнулся на этот пост, как и я, — использовать find -exec :
В моем случае мне нужен был более надежный вариант, который просматривал бы несколько подкаталогов, поэтому я решил использовать find . Разбираем:
Поиск в текущем рабочем каталоге.
Интересуют только файлы, а не каталоги и т. д.
Сократить набор результатов по имени
Выполните команду cat для каждого результата. "+" означает, что создан только 1 экземпляр кота (спасибо @gniourf_gniourf)
Как объяснялось в других ответах, добавьте содержимое с кошачьим текстом в конец выходного файла.
В этом ответе много недостатков. Во-первых, подстановочный знак *.txt должен быть заключен в кавычки (иначе вся команда find в том виде, в каком она написана, бесполезна). Другой недостаток связан с грубым заблуждением: выполняется команда не cat >> 0.txt <> , а cat <> . Ваша команда фактически эквивалентна < find . -type f -name *.txt -exec cat '<>' \; ; > >> 0.txt (я добавил группировку, чтобы вы понимали, что происходит на самом деле). Другой недостаток заключается в том, что find собирается найти файл 0.txt , а cat будет жаловаться, говоря, что входной файл является выходным файлом.
Спасибо за исправления. Мой случай был немного другим, и я не подумал о некоторых из этих ошибок применительно к этому делу.
Вы должны поставить >> output.file в конце своей команды, чтобы никто (включая вас) не подумал, что find будет выполнять команду cat <> >> output.file для каждого найденного файла.< /p>
Начинаю хорошо выглядеть! Последнее предложение: используйте -exec cat <> + вместо -exec cat <> \; , так что только один экземпляр cat создается с несколькими аргументами ( + определяется POSIX).
Хороший ответ и предупреждение — я изменил свой на: find . -type f -exec cat <> + >> outputfile.txt и не мог понять, почему мой выходной файл не перестает увеличиваться в гигабайтах, хотя каталог был всего 50 мегабайт. Это было потому, что я продолжал добавлять файл outputfile.txt к самому себе! Поэтому просто убедитесь, что вы правильно назвали этот файл или поместите его в другой каталог, чтобы этого избежать.
если у вас есть определенный тип вывода, сделайте что-то вроде этого
Имейте в виду, что вы теряете возможность поддерживать порядок слияния.Это может повлиять на вас, если ваши файлы названы, например. file_1 , file_2 , … file_11 из-за естественного порядка сортировки файлов.
Если все ваши файлы находятся в одном каталоге, вы можете просто сделать
Файлы 1.txt, 2.txt, .. перейдут в 0.txt
Эсвар уже ответил. Имейте в виду, что вы теряете возможность поддерживать порядок слияния. Это может повлиять на вас, если ваши файлы названы, например. file_1 , file_2 , … file_11 из-за естественного порядка сортировки файлов.
Если все ваши файлы имеют одинаковые имена, вы можете просто сделать следующее:
Я нашел эту страницу, потому что мне нужно было объединить 952 файла в один. Я обнаружил, что это работает намного лучше, если у вас много файлов. Это сделает цикл для любого количества чисел, которое вам нужно, и выделит каждое из них, используя >> для добавления в конец 0.txt.
как указано в комментариях:
Другой вариант sed :
Или без перенаправления.
Обратите внимание, что в последней строке напишите также merge.txt (не wmerge.txt!). Вы можете использовать w"merge.txt", чтобы избежать путаницы с именем файла, и -n для тихого вывода.
Конечно, вы также можете сократить список файлов с помощью подстановочных знаков. Например, в случае нумерованных файлов, как в приведенных выше примерах, вы можете указать диапазон с помощью фигурных скобок следующим образом:
если ваши файлы содержат заголовки и вы хотите удалить их из выходного файла, вы можете использовать:
Все (текстовые) файлы в один
xargs создает выходные строки find . аргументы кота.
У поиска есть много параметров, например -name '*.txt' или -type.
вы должны проверить их, если хотите использовать их в своей воронке
Вы должны объяснить, что делает ваша команда. Кстати, вы должны использовать find с --print0 и xargs с -0, чтобы избежать некоторых предостережений со специальными именами файлов.
Если исходный файл содержит непечатаемые символы, они будут потеряны при использовании команды cat. Используя 'cat -v', непечатаемые символы будут преобразованы в видимые строки символов, но выходной файл все равно не будет содержать фактических непечатаемых символов в исходном файле. При небольшом количестве файлов альтернативой может быть открытие первого файла в редакторе (например, vim), который обрабатывает непечатаемые символы. Затем перейдите в конец файла и введите ":r second_file_name". Это потянет второй файл, включая непечатаемые символы. То же самое можно сделать и с дополнительными файлами. Когда все файлы будут прочитаны, введите «:w». Конечным результатом является то, что первый файл теперь будет содержать то, что он делал изначально, плюс содержимое файлов, которые были прочитаны.
Если вы хотите добавить содержимое 3 файлов в один файл, то следующая команда будет хорошим выбором:
Содержимое всех файлов будет объединено в файл4, а вывод консоли будет передан в /dev/null .
Отправить несколько файлов в файл (textall.txt):
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками linux bash unix или задайте свой вопрос.
Связано
Связанные
Горячие вопросы о сети
Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.
дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.18.41718
Метаморворкс / Getty Images
Существует несколько способов объединения и сортировки текстовых файлов в Linux, но то, как это сделать, зависит от того, чего вы пытаетесь достичь — хотите ли вы просто поместить содержимое нескольких файлов в один большой файл, или организовать его таким образом, чтобы его было легче использовать. В этом посте мы рассмотрим некоторые команды для сортировки и объединения содержимого файлов и сосредоточимся на том, чем отличаются результаты.
Использование кота
Если все, что вы хотите сделать, это объединить группу файлов в один файл, то команда cat будет отличным выбором. Все, что вам нужно сделать, это ввести «cat», а затем перечислить файлы в командной строке в том порядке, в котором вы хотите, чтобы они были включены в объединенный файл. Перенаправьте вывод команды в файл, который вы хотите создать. Если файл с указанным именем уже существует, он будет перезаписан создаваемым вами. Например:
Если вы хотите добавить содержимое серии файлов в существующий файл, а не перезаписать его, просто измените > на >>.
Если объединяемые файлы соответствуют какому-либо удобному соглашению об именах, задача может быть еще проще. Вам не нужно будет включать все имена файлов, если вы можете указать их с помощью регулярного выражения. Например, если все файлы заканчиваются словом «файл», как в приведенном выше примере, вы можете сделать что-то вроде этого:
Обратите внимание, что показанная выше команда добавит содержимое файла в алфавитно-цифровом порядке. В Linux файл с именем «filea» будет добавлен перед файлом с именем «fileA», но после файла с именем «file7». В конце концов, мы не просто должны думать «ABCDE», когда имеем дело с буквенно-цифровой последовательностью; мы должны думать "0123456789aAbBcCdDeE". Вы всегда можете использовать такую команду, как "ls *file", чтобы просмотреть порядок, в котором файлы будут добавлены перед объединением файлов.
ПРИМЕЧАНИЕ. Рекомендуется сначала убедиться, что ваша команда включает все файлы, которые вы хотите включить в объединенный файл, и никакие другие, особенно если вы используете подстановочный знак, такой как «*». И не забывайте, что объединенные файлы по-прежнему будут существовать как отдельные файлы, которые вы, возможно, захотите удалить после проверки объединения.
Объединение файлов по возрасту
Если вы хотите объединить файлы на основе возраста каждого файла, а не по именам файлов, используйте команду, подобную этой:
Использование параметров -tr (t=время, r=реверс) приводит к отображению списка файлов в порядке возрастания старейших. Это может быть полезно, например, если вы ведете журнал определенных действий и хотите, чтобы содержимое добавлялось в том порядке, в котором выполнялись действия.
$$ в приведенной выше команде представляет собой идентификатор процесса для команды при ее запуске. В этом совершенно нет необходимости, но это делает практически невозможным непреднамеренное добавление в конец существующего файла вместо создания нового. Если вы используете $$, результирующий файл может выглядеть так:
Объединение и сортировка файлов
В Linux есть несколько интересных способов сортировки содержимого файла до или после слияния.
Сортировка содержимого по алфавиту
Если вы хотите отсортировать содержимое объединенного файла, вы можете отсортировать все содержимое с помощью следующей команды:
Если вы хотите, чтобы контент был сгруппирован по файлам, отсортируйте каждый файл, прежде чем добавлять его в новый файл, с помощью следующей команды:
Сортировка файлов по номерам
Для числовой сортировки содержимого файла используйте параметр -n с сортировкой. Эта опция полезна только в том случае, если строки в ваших файлах начинаются с цифр. Имейте в виду, что в порядке по умолчанию «02» будет считаться меньшим, чем «1». Используйте параметр -n, если хотите, чтобы строки сортировались в числовом порядке.
Параметр -n также позволяет сортировать содержимое файлов по дате, если строки в файлах начинаются с дат в формате, например, "2020-11-03" или "2020/11/03" (год, месяц, день). формат). Сортировка по дате в других форматах будет сложной и потребует гораздо более сложных команд.
Использование вставки
Команда вставки позволяет объединять содержимое файлов построчно. При использовании этой команды первая строка объединенного файла будет содержать первую строку каждого из объединяемых файлов. Вот пример, в котором я использовал заглавные буквы, чтобы было легче увидеть, откуда берутся строки:
Перенаправить вывод в другой файл, чтобы сохранить его:
Кроме того, вы можете вставлять файлы вместе, чтобы содержимое каждого файла объединялось в одну строку. Для этого необходимо использовать параметр -s (последовательный). Обратите внимание, как на этот раз вывод показывает содержимое каждого файла:
Использование соединения
Еще одна команда для объединения файлов — join. Команда join позволяет объединить содержимое нескольких файлов на основе общего поля. Например, у вас может быть один файл, содержащий номера телефонов группы сотрудников, а другой — их личные адреса электронной почты, и оба они перечислены по именам отдельных лиц. Вы можете использовать соединение, чтобы создать файл с телефонными номерами и адресами электронной почты.
Одним важным ограничением является то, что файлы должны иметь строки, перечисленные в одном порядке, и включать поле соединения в каждом файле.
Вот пример команды:
В этом примере первое поле (имена) должно существовать в каждом файле, даже если дополнительная информация отсутствует, иначе команда завершится ошибкой. Сортировка содержимого полезна и, вероятно, намного проще в управлении, но не является обязательной, если порядок соблюден.
Подведение итогов
В Linux есть много возможностей для объединения и сортировки данных, хранящихся в отдельных файлах. Такой выбор может сделать некоторые утомительные задачи на удивление легкими.
Присоединяйтесь к сообществам Network World на Facebook и LinkedIn, чтобы комментировать самые важные темы.
Сандра Генри-Стокер занимается администрированием систем Unix более 30 лет.Она описывает себя как «USL» (Unix как второй язык), но помнит достаточно английского, чтобы писать книги и покупать продукты. Она живет в горах в Вирджинии, где, когда не работает с Unix и не пишет о ней, отгоняет медведей от своих кормушек для птиц.
Давайте рассмотрим различные способы объединения нескольких файлов в Linux. Для этой цели мы в основном будем использовать команду cat. Итак, приступим!
В оставшейся части этого руководства мы рассмотрим три файла. Давайте создадим эти файлы:
Мы будем использовать команду cat для создания этих файлов, но вы также можете использовать команду touch/nano для создания и редактирования файлов.
Оглавление
Отображение контента вместе
Поскольку команда cat является сокращением от Concatenate, она используется в первую очередь для объединения содержимого.
Вывод
Обратите внимание, что порядок отображения содержимого совпадает с порядком, в котором файлы отображаются в команде. Мы можем изменить порядок в команде и проверить.
Файлы в другом порядке
Объединить несколько файлов в Linux и сохранить их в другом файле
Чтобы сохранить содержимое, отображавшееся на экране в предыдущем примере, используйте оператор перенаправления. (>)
Вывод сохранен в файле. Здесь важно отметить, что команда cat сначала создаст файл, если он не существует. Единственный оператор перенаправления перезапишет файл, а не добавит его в конец. Чтобы добавить содержимое в конце, рассмотрим следующий пример.
Добавление содержимого в существующий файл
Чтобы добавить содержимое после объединения нескольких файлов в Linux в другой файл, используйте оператор двойного перенаправления. (>>) вместе с командой cat.
Эта команда не перезаписывает содержимое файла, а добавляет содержимое в конец файла. Игнорирование таких мелких деталей может привести к нежелательной ошибке.
Использование команды sed для объединения нескольких файлов в Linux
Команда Sed, в основном используемая для выполнения преобразований и манипуляций с текстом, также может использоваться для объединения файлов.
Содержимое файлов временно сохраняется в буфере хранения, который обычно используется для хранения шаблона. Затем он записывается в указанный файл.
Автоматизация процесса с помощью цикла For
Цикл For может сэкономить усилия, связанные с явным упоминанием имен файлов. Это будет работать только в том случае, если имена файлов соответствуют шаблону. Как и в нашем случае, имена файлов следуют шаблону: file.txt. Это можно использовать для использования цикла for.
Код просто использует тот факт, что файлы имеют одинаковые имена. Это должно побудить вас подумать о том, как вы хотите называть свои файлы в будущем.
Заключение
В этом руководстве мы рассмотрели некоторые способы объединения нескольких файлов в Linux. Процесс объединения не является исключительным для текстовых файлов. Другие файлы, такие как журналы, системные отчеты, также могут быть объединены. Использование цикла For для объединения файлов экономит много усилий, если количество объединяемых файлов слишком велико.
Читайте также: