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

Хорошо, у меня две папки. Для простоты я буду называть их 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 .

  • Поиск строки в файлах в текущем каталоге, опустить дубликаты
  • Отправка настраиваемого контента на основе определенного поиска в файле журнала
  • Распечатывать список файлов меньше указанного размера файла
  • Есть ли html-поиск / поисковик документов, например, служебная информация для информационных файлов?
  • Как найти пакет Fedora, обеспечивающий необходимую мне зависимость?
  • Как разбирать файл с конца в awk
  • Как заменить токены из одного файла данными из другого?
  • grep, как подавить отображение несогласованного файла?
  • Попытка использовать `pwd` внутри псевдонима, дающего неожиданные результаты
  • Как выполнить grep на FTP?
  • Поиск файла на основе диапазона данных
  • Interesting Posts

    Есть ли альтернатива grep -A -B -C-переключателям (для печати нескольких строк до и после)?

    vim: использование переменной for-loop-iterator в шаблоне поиска

    Почему этот скрипт дает синтаксическую ошибку «Неожиданный конец файла»?

    «Нет платы Ethernet» при установке стабильной версии debian

    Ошибка компиляции исходного кода, возможно, связанного с cpp

    Как запросить ввод от пользователя из переменной или массива bash?

    Как создать массив 3x3TB RAID 5 без потери данных с двух дисков?

    Что делать, если apt-get -f не работает?

    Почему foo = bar отличается от foo = bar?

    Я хотел бы запустить несколько команд терминала изнутри vim

    команда для объединения серии файлов

    Сервер Apache: проблема разрешения и символической ссылки

    Получение скорости соединения USB Ethernet

    Запуск команд при запуске

    Если ^ a ^ b заменяет «a» один раз в последней команде, что я использую для замены всех вхождений «a»?

    Linux и Unix - лучшая ОС в мире.