Количество строк с определенным значением в столбце для всех файлов в каталоге рекурсивно

У меня 40 файлов в каталоге, и я хочу подсчитать количество раз, когда в каждом столбце в каждом файле есть строка с «2».

Я пытаюсь что-то вроде этого, но он печатает общую сумму из каждого файла, и мне нужны отдельные суммы:

find . -type f -print0 | xargs -0 awk '($1=="2"){++count} END {print count}' 

Просто для того, чтобы это было ясно, это пример:

file_1

 2 345 123 4 2 4567 2344 6 3 2345 657 87 6 234 345 6 

file_2

 1 12 436 7 2 54 86 8 2 23 48 0 2 098 0 8 8 98 9 0 

РАСПЕЧАТАТЬ:

 FILE_1 2 FILE_2 3 

Что я на самом деле получаю:

РАСПЕЧАТАТЬ:

 5 

Спасибо за вашу помощь!

  • Как получить количество ссылок на файлы в папке с этими ссылками?
  • Поиск значений в 2 столбцах из CSV
  • grep, как подавить отображение несогласованного файла?
  • Есть ли html-поиск / поисковик документов, например, служебная информация для информационных файлов?
  • Emacs: запрос-замена, регулярное выражение, повторное использование результата поиска
  • Как фильтровать базовые csv по столбцам
  • Как предоставить программе дополнительное имя / метку для поиска?
  • Найти текст в файле и скопировать его в другой файл
  • 3 Solutions collect form web for “Количество строк с определенным значением в столбце для всех файлов в каталоге рекурсивно”

    Вы можете посчитать их для вас. Предполагая, что строки, которые вам нужны, начинаются с 2 , вы можете использовать следующее:

     grep -c '^[[:space:]]*2\>' $(find . -type f -print0 | xargs -0 echo) 

    \> В конце регулярного выражения гарантирует, что совпадение остановится на «границе слова», чтобы избежать ложных тревог, таких как строки, начинающиеся с 20 вместо 2.

    Заметка:

    Если «40 файлов», которые вы ищете, находятся в одном каталоге (не в подкаталогах), вы можете сделать поиск в текущем каталоге без повторения (так что вы получите меньше латентности):

     find -maxdepth 1 . -type f -print0 

    Обновить:

    Чтобы сопоставить файлы, в которых 2 встречается в другом столбце, вы можете сделать это:

     COLNUM=3 TOMATCH=$(($COLNUM-1)) grep -cE "^[[:space:]]*([0-9]+[[:space:]]+){$TOMATCH}2\>" \ $(find . -type f -print0 | xargs -0 echo) 

    Вы можете изменить COLNUM мере необходимости. В основном, что это делает, он пытается сопоставить COLNUM-1 а затем 2 на границе слова. Переключатель -E необходим для включения расширенных регулярных выражений, который позволяет использовать нотацию {} для указания числового квантификатора (т. Е. «Совпадение с предыдущим шаблоном много раз»).

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

    Несколько решений:

    1. выполнить awk для каждого файла с помощью опции find -exec :

       find . -type f \ -exec awk '($1=="2"){++count}END{print FILENAME ": " count}' {} \; 
    2. используйте переменную awk FNR для обнаружения изменения файла в awk-скрипте:

       find . -type f -print0 | xargs -0 \ awk 'FNR==1{if (NR!=1){print count} printf("%s: ", FILENAME);}($1=="2"){++count}END{print count}' 

    Если вы не против изменения вывода, вы можете сделать следующее:

     $ grep "^2" *|awk '{print $1}'|uniq -c 2 FILE_1:2 3 FILE_2:2 

    Если вы хотите, чтобы ваш вывод PRINT:

     $ grep "^2" *|awk '{print $1}'|uniq -c|sed 's/:2//'|awk '{print $2, $1}' FILE_1 2 FILE_2 3 
    Linux и Unix - лучшая ОС в мире.