Вопрос или проблема
У меня есть каталог, содержащий разные текстовые файлы, такие как:
ajac001a00.24o
ajac001a15.24o
ajac001a30.24o
.
.
areg001a00.24o
areg001a15.24o
areg001a30.24o
.
.
Мне нужно объединить эти текстовые файлы по отдельности, начиная с одинаковых четырех символов, например
cat *ajac* > ajac_combined
cat *areg* > areg_combined
Как я могу сделать это с помощью цикла? Слишком много файлов начинается с разных символов, поэтому это не может быть сделано с помощью команды cat вручную.
Вы можете собрать все файлы в массив, затем обрезать первые 4 символа, чтобы получить список префиксов, а затем пройтись по префиксам, чтобы объединить файлы. Вот так:
files=(*24o)
printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u |
while read -r prefix; do
cat "$prefix"* >> "$prefix"_combined
done
Команда printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u
выполняет основную работу. Сначала команда printf
выводит каждый элемент массива $files
на отдельной строке. Это дает нам список имен файлов, и затем мы выбираем первые 4 символа с помощью cut -c1-4
. Обратите внимание, что это предполагает простые ASCII имена файлов, без юникода, поэтому каждый символ представляет собой один байт. Затем мы передаем список префиксов через sort -u
, чтобы удалить дубликаты, а затем передаем их в цикл.
Я использовал cat "$prefix"*
вместо cat *"$prefix"*
, как вы указали в вопросе, поскольку это все префиксы и перед ними нечего совпадать.
Ответ или решение
Для объединения текстовых файлов в вашем каталоге на основе первых четырех символов имен файлов, вы можете использовать следующий скрипт на Bash. Данный подход позволяет автоматизировать процесс, поскольку количество файлов может быть значительным и вручную прописывать команды для каждого префикса довольно утомительно.
Вот пример скрипта:
# Получаем список всех файлов, которые заканчиваются на .24o
files=(*.24o)
# Извлекаем первые 4 символа уникальных префиксов и проходим по ним в цикле
printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u |
while read -r prefix; do
# Объединяем файлы с текущим префиксом в новый файл
cat "${prefix}"*.24o > "${prefix}_combined.24o"
done
Объяснение кода:
-
Получение списка файлов:
files=(*.24o)
– собираем все файлы с расширением.24o
в массивfiles
. -
Извлечение уникальных префиксов:
printf '%s\n' "${files[@]}"
– выводим имена файлов построчно.cut -c1-4
– обрезаем имена файлов до первых четырех символов.sort -u
– сортируем список префиксов и удаляем дубликаты.
-
Объединение файлов по префиксам:
Внутри циклаwhile
для каждого уникального префикса:cat "${prefix}"*.24o > "${prefix}_combined.24o"
– выполняем командуcat
, которая объединяет все файлы, начинающиеся с текущего префикса, и сохраняем результат в новый файл с именем формата{префикс}_combined.24o
.
Этот скрипт обеспечит автоматическую обработку, и вам не придется вручную объединять файлы для каждого префикса, что значительно упростит вашу работу. Если у вас есть дополнительные вопросы или вам нужна помощь с другими задачами, не стесняйтесь обращаться!