1

В настоящее время я застрял в том, что казалось легкой задачей. Я работал над сценарием Python, который находит определенные файлы в папке «Загрузки» и помещает их в другую подпапку в другой папке. Затем он преобразует PDF-файлы в указанной папке в текстовые файлы, так как я буду извлекать информацию из файлов (и с TXT работать намного проще).

Теперь я застрял в следующей части: у меня ~ 600 файлов (и их будет еще больше), и я хочу объединить файлы на основе имени файла. Вот как имена файлов отформатированы ...

  • Txt_BI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf
  • Txt_BI_BrofilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf (1)
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf (1)

Обратите внимание, что существуют файлы, которые имеют общее имя файла, но различаются с помощью .pdf(1). Мне нужен сценарий powershell или bash, который группирует и объединяет файлы в консолидированные текстовые файлы на основе сходства имен файлов.

Итак, учитывая имена файлов выше, я хочу объединить весь контент в

'TxtBI_ProfilesBI_Profile_Export_BB+Generic_August+ 2016_GGP_20170316.pdf' + 'Txt_BI_ProfilesBI_Profile_Export_BB+Generic_August+ 2016_GGP_20170316.pdf (1)' в PDF-файл (1)'в PDF-файл (1)' GG + PDF

и то же самое касается «Поиск». Для групп «BB +Generic_August +2016_GGP» и «Поиск» существует до примерно «.pdf(40)» разных файлов, и существует около 10 или более разных групп файлов с одинаковыми именами файлов. Я написал скрипт на python, который пытается сделать это здесь, но все, что он делает, это разделяет имена файлов [33:] и filenames.rsplit('', 1) [0] (разделяет после символа 33 и последнего '_') и не объединять их в консолидированные файлы, как я упоминал выше. Могу ли я сделать это с PowerShell или Bash? Так, что он разбивает имена файлов (как указано выше), а затем объединяет их, если они содержат одинаковое текстовое имя файла?

Я думал, что это будет очень легко, но это не работает для меня. Если у кого-то есть идеи / идеи / предложения о том, как к этому подойти, я был бы очень признателен! Раньше использовали bash для unix, но это было давно. Я пойду с тем, что наиболее практично! Еще немного новичка, когда дело доходит до программирования ....

1 ответ1

1

Изменить: лучшее решение, которое производит желаемые имена выходных файлов

Использование ls , awk и cat:

ls | awk '! /\([0-9]+\)/ {match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches); system("cat " $0 "* >"matches[1] ".txt")}'

В ответ на то, что Мэтью продемонстрировал способности Пауэршелла, я должен был показать, что того же можно достичь в среде bash. Это только один из многих способов, как это принято в мире UNIX.

Объяснение:

ls перечисляет все элементы в текущем каталоге

Язык программирования awk предназначенный для обработки текста

! /\([0-9]+\)/ исключить имена файлов, которые содержат число в скобках

match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches) выполняет сопоставление регулярного выражения для имени файла, захватывая часть между общим префиксом и первой точкой

system(" выполнить системную команду

cat " $0 "* объединяет файлы, начинающиеся с имени файла

>"matches[1] ".txt" выходному файлу с именем, подобным захваченному выражению, и с расширением .txt


Первый ответ: вы можете использовать find , xargs , bash и cat:

find . -type f -regextype sed ! -regex "\./.*([0-9]\+)" | xargs -I{} bash -c 'cat {}* > {}.txt'

Это скорее подтверждение концепции и может быть улучшено, так как выходные имена файлов не совсем то, что вы искали, но должно быть достаточно для немедленного решения вашей проблемы.

Объяснение:

find . поиск в текущем каталоге

-type f искать файлы

-regextype sed использует механизм регулярных выражений с sed-совместимым синтаксисом

! -regex "\./.*([0-9]\+)" исключить результаты, которые соответствуют указанному регулярному выражению, т.е. те, которые включают число в скобках в конце

| xargs использует каждый результат для создания команды

-I{} в следующей команде заменять {} каждым результатом find

bash -c передать следующую строку в качестве команды для bash

'cat {}* > {}.txt' объединяет файлы, которые начинаются с найденного имени файла, в файл, имя которого составлено из результата find и расширения .txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .