Как вывести количество документов на одного автора в каталоге

Я пытаюсь подсчитать набор документов из текстового набора данных по авторам. У меня есть каталог книг, которые названы автором, за которым следует название. Я хочу вывести количество документов в каталоге для каждого автора. Пример некоторых файлов можно увидеть здесь для команды ls:

'Winston Churchill___Richard Carvel, Complete.txt'
'Winston Churchill___The Celebrity, Complete.txt'
'Winston Churchill___The Crisis, Complete.txt'
'Winston Churchill___The Crossing.txt'
'Winston Churchill___The Dwelling Place of Light, Complete.txt'
'Winston Churchill___The Inside of the Cup, Complete.txt'
'Zane Grey___Betty Zane.txt'
'Zane Grey___Desert Gold.txt'
'Zane Grey___Riders of the Purple Sage.txt'
'Zane Grey___Tales of Fishes.txt'
'Zane Grey___Tales of lonely trails.txt'
'Zane Grey___The Border Legion.txt'
'Zane Grey___The Call of the Canyon.txt'
'Zane Grey___The Day of the Beast.txt'
'Zane Grey___The Desert of Wheat.txt'

Я не могу сосчитать их вручную, так как там более 3000 документов.

0
23.06.2020, 09:31
2 ответа

Следующее должно помочь (принять суффикс .txt-,нет подпапок и «___» в качестве разделителя авторов):

find -maxdepth 1 -mindepth 1 -name '*.txt' -printf '%f\n' | awk -F'___' '{print $1}' | sort | uniq -c

В разных строках для удобства чтения:

find./ -maxdepth 1 -mindepth 1 -name '*.txt' -printf '%f\n' |
  awk -F'___' '{print $1}' |
  sort |
  uniq -c

Что он делает:

  • используйте findдля вывода списка всех файлов с:

    a).txt-суффикс(-name '*.txt')

    b )в текущем каталоге, а не в подкаталогах(-maxdepth 1)

    c )без указания самого каталога(-mindepth 1)

    d )вывести имя файла без начального имени каталога и новой строки в конце-printf '%f\n'

  • использоватьawk

    a) define three underscores as field separator `-F'___'`
    
    b) print first field (author) only `'{print $1}'`
    
  • sortвывод на всякий случай

  • используйте uniqдля перечисления только уникальных записей и -cподсчитайте их


Конечно, если в ваших именах файлов есть такие вещи, как новые строки, вам придется прибегнуть к нулевым -завершенным листингам. Поэтому для особо осторожной обработки:

find./ -maxdepth 1 -mindepth 1 -name '*.txt'  -printf '%f\000' | awk 'BEGIN {RS="\x00" ; FS="___" ; ORS=\x00"} {print $1}' | sort -z | uniq -zc | tr '\000' '\n'

Тем не менее, я считаю это излишеством.

2
18.03.2021, 23:24
$ for name in *___*.txt; do printf '%s\n' "${name%%__*}"; done | uniq -c
   6 Winston Churchill
   9 Zane Grey

Это просто печатает имена авторов в uniq -c, что подсчитывает появление каждого имени. Имя получается из каждого имени файла путем удаления всего, начиная с первого вхождения___(тройного подчеркивания )в имени файла.

Сортировка вывода цикла перед вызовом uniq -cне требуется, так как результат расширения имени файла всегда сортируется (лексикографически ).

Это предполагает, что имя автора не содержит символов новой строки. Однако допускаются символы новой строки после тройного подчеркивания.

0
18.03.2021, 23:24

Теги

Похожие вопросы