Вопрос или проблема
У меня есть файл RTF, который содержит список путей к pdf-файлам. Например:
Категория1:
./Папка1/Папка2/1.pdf:18
./Папка3/2.pdf:18
./Папка5/4.pdf:10
Категория2:
./Папка3/2.pdf:18
./Папка5/4.pdf:10
Категория3:
./Папка1/Папка2/1.pdf:18
./Папка5/4.pdf:10
Категория4:
./Папка6/7.pdf:10
./Папка5/4.pdf:10
./Папка3/2.pdf:18
Примечание: Число num после *.pdf:num можно игнорировать. Полный путь к папке тоже можно игнорировать. Объектом интереса является только имя файла.pdf.
Я хотел бы получить отсортированный вывод по именам pdf и количеству их появления.
Вывод будет в формате (имя файла : количество раз, когда файл встречался в rtf), например:
4.pdf : 4
2.pdf : 3
Примечание 2: Любой файл, который упоминается менее 3 раз, можно игнорировать.
Извлеките этот файл, чтобы он стал текстовым файлом, затем выполните
$ sed < TEXT.txt -nre 's,.*/([^:/]+).*,\1,p' | sort | uniq -c
2 1.pdf
3 2.pdf
4 4.pdf
1 7.pdf
Одним из возможных инструментов является awk
. Эта команда может справиться с задачей:
awk -F\/ '/pdf/{split($NF,a,":");b[a[1]]+=1} END {for (i in b) if(b[i]>2) print i" : "b[i]}' input_file
Скрипт использует /
в качестве разделителя, затем split
помещает последнее поле в a
с разделителем :
, счетчик записывается в b
для вхождений a
. На конце выводятся все элементы a
, где количество > 2.
Можно упростить, разделив строку, используя разделители /
и :
. В таком случае скрипт выглядит так:
awk -F'[/:]' '/pdf/{b[$(NF-1)]+=1} END {for (i in b) if(b[i]>2) print i" : "b[i]}' input_file
Ответ или решение
Для решения задачи, связанной с подсчетом и сортировкой файлов на основе их имен в RTF файле, мы представляем пошаговую инструкцию. Основной задачей является извлечение имен файлов из указанных путей, подсчет их повторений и вывод результатов с фильтрацией по количеству появлений.
Шаги для выполнения задачи
-
Извлечение имен PDF файлов: Для начала нам нужно извлечь имена файлов из файла формата RTF. В вашем случае информация о каждом файле записана в формате
путь/к/папке/имя_файла.pdf:число
. Мы будем игнорировать полные пути и числа, оставляя только имена файлов. -
Подсчет повторений: После того как мы извлекли имена файлов, необходимо подсчитать количество раз, которое каждое имя файла встречается в списке.
-
Фильтрация по количеству появлений: Далее мы отфильтруем файлы. В соответствии с вашим запросом, будем игнорировать все файлы, названия которых встречаются менее трех раз.
-
Сортировка и вывод результатов: Наконец, мы отсортируем оставшиеся файлы по количеству их появлений и выведем в заданном вами формате.
Использование инструментария Linux
Вы можете воспользоваться инструментарием Unix/Linux, таким как awk
, чтобы эффективно решить эту задачу. Вот пример команды awk
, который выполнит вышеуказанные шаги:
awk -F'[/:]' '/pdf/{b[$(NF-1)]+=1} END {for (i in b) if(b[i]>2) print i" : "b[i]}' имя_файла.RTF
Объяснение команды:
-F'[/:]'
: Устанавливаем в качестве разделителей символы/
и:
. Это значит, чтоawk
будет разбивать строки по этим символам./pdf/
: Проверяет, содержит ли строка словоpdf
, что указывает на то, что строка относится к PDF файлу.b[$(NF-1)]+=1
: Определяет, что перед последней частью (имя файла) в строке будет подсчитано количество его упоминаний.END {for (i in b) if(b[i]>2) print i" : "b[i]}
: В конце перебирает все элементы массиваb
и выводит имена файлов и их количество, если оно больше двух.
Пример использования
Предположим, ваш файл называется documents.RTF
и содержит указанный вами текст. Выполнение команды, приведенной выше, даст следующий результат:
4.pdf : 4
2.pdf : 3
Это значит, что файл 4.pdf
встретился 4 раза, а 2.pdf
— 3 раза, в соответствии с вашими требованиями.
Заключение
Используя предложенный подход с awk
, вы сможете быстро и эффективно провести подсчет и сортировку файлов по их количеству повторений. Этот метод не только сэкономит ваше время, но и произведет результат в нужном вам формате. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться за поддержкой.