используйте команду cat с различными выводами в цикле

Вопрос или проблема

У меня есть каталог, содержащий разные текстовые файлы, такие как:

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

Объяснение кода:

  1. Получение списка файлов:
    files=(*.24o) – собираем все файлы с расширением .24o в массив files.

  2. Извлечение уникальных префиксов:

    • printf '%s\n' "${files[@]}" – выводим имена файлов построчно.
    • cut -c1-4 – обрезаем имена файлов до первых четырех символов.
    • sort -u – сортируем список префиксов и удаляем дубликаты.
  3. Объединение файлов по префиксам:
    Внутри цикла while для каждого уникального префикса:

    • cat "${prefix}"*.24o > "${prefix}_combined.24o" – выполняем команду cat, которая объединяет все файлы, начинающиеся с текущего префикса, и сохраняем результат в новый файл с именем формата {префикс}_combined.24o.

Этот скрипт обеспечит автоматическую обработку, и вам не придется вручную объединять файлы для каждого префикса, что значительно упростит вашу работу. Если у вас есть дополнительные вопросы или вам нужна помощь с другими задачами, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...