Как получить количество ссылок на файлы в папке с этими ссылками?

Хорошо, у меня две папки. Для простоты я буду называть их people и animals . В папке «Животные» есть файл для каждого животного, а папка «Люди» содержит файл для каждого человека со ссылками на животных, которыми владеет этот человек. Это то, что у меня есть до сих пор:

 ls -1 ~/animals | cut -d. -f1 | grep -R -f - ~/people 

Синтаксис grep, который я получил отсюда . Я пытаюсь заставить его сказать:

 dog: 8 cat: 7 hippo: 2 

Вместо этого я добавляю флаг -c в grep и я получаю:

 Bob.txt: 0 Cathy.txt: 0 John.txt: 0 Patrick.txt: 1 

Как я могу получить количество животных в целом, а не животных для каждого человека?

2 Solutions collect form web for “Как получить количество ссылок на файлы в папке с этими ссылками?”

Вот способ получить нужные результаты с помощью GNU awk :

 awk ' BEGINFILE { if (FILENAME ~ "^animals/" || FILENAME ~ "/animals/") { this_name = substr(FILENAME, index(FILENAME,"animals/")+length("animals/")) i = index(this_name, ".") if (i > 0) this_name = substr(this_name, 1, i-1) critter[++num] = this_name critter_count[num] = 0 nextfile } } { for (i = 1; i <= num; i++) { if ($0 ~ critter[i]) critter_count[i]++ } } END { for (i = 1; i <= num; i++) print critter[i] ": " critter_count[i] } ' animals/* people/* 
  • После запуска нового файла ( BEGINFILE ) проверьте, начинается ли его название с animals/ или содержит /animals/ . Это позволяет вам ./animals/* animals/* , ./animals/* или ~/animals/* . Если это произойдет,

    • Извлеките подстроку справа от animals/ .
    • Тогда ищите a . ; если найден, извлеките подстроку слева от нее.
    • Добавьте эту строку (базовое имя файла, с удаленным каталогом и расширением) в массив critter_count critter[] и инициализируйте соответствующий critter_count 0.

    ☛ Обратите внимание, что BEGINFILE и следующий nextfile недоступны в POSIX awk.

  • В противном случае (если мы смотрим на файл people ), прокрутите имена животных ( critter s) и подсчитайте строки, которые соответствуют им.
  • Достигнув END всех входных данных, сообщите имена животных, которые были извлечены из имен файлов animals , и подсчет того, как часто каждый из них появляется в файле people .

Это не будет рекурсивно искать каталог people ; Я не видел никаких утверждений в вопросе о том, что это было необходимо.

Я думаю, что если вы дадите шаблоны в качестве вклада в grep используя stdin , он будет конкатенировать результаты для всех шаблонов. Таким образом, AFAIK единственный способ преодолеть эту проблему – вызвать новый экземпляр grep для каждого шаблона.

Этот скрипт будет работать в этом случае

 for animalName in $(ls -1 ~/animals | cut -d. -f1); do echo "$animalName: $(grep -R -h -c $animalName ~/people | paste -sd+ | bc)"; done 

Это связано с тем, что вы пробовали с некоторыми незначительными изменениями. Во-первых, опция -h в grep подавляет печать имен файлов. Во-вторых, с помощью только grep вывод для шаблона будет похож на

 1 0 3 2 

Мы хотим добавить все эти числа. команда paste объединяет эти строки с символом + а затем передает сформированную строку в bc для вычисления результата.

ПРИМЕЧАНИЕ. Если имена ваших животных содержат символы новой строки или любые специальные символы (в какой-то странной стране), нецелесообразно разбирать вывод ls .

  • grep, как подавить отображение несогласованного файла?
  • Количество строк с определенным значением в столбце для всех файлов в каталоге рекурсивно
  • Найти файлы между двумя папками в linux?
  • Распечатывать список файлов меньше указанного размера файла
  • Как выполнить grep на FTP?
  • Как разбирать файл с конца в awk
  • Найти текст в файле и скопировать его в другой файл
  • Emacs: запрос-замена, регулярное выражение, повторное использование результата поиска
  • Поиск и замена вопроса
  • Поиск строки в нескольких ZIP-файлах
  • Как фильтровать базовые csv по столбцам
  • Linux и Unix - лучшая ОС в мире.