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

У меня 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 

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

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 
  • Поиск строки в файлах в текущем каталоге, опустить дубликаты
  • Распечатывать список файлов меньше указанного размера файла
  • Есть ли html-поиск / поисковик документов, например, служебная информация для информационных файлов?
  • Поиск значений в 2 столбцах из CSV
  • инструмент в терминале, например, шлем-шлейф / шлем для терминала?
  • Как предоставить программе дополнительное имя / метку для поиска?
  • Как я могу найти, какие csv-файлы связаны (т. Е. Имеют ссылки на внешние ключи) другим?
  • строка grep, где следующая строка не содержит строки
  • Как фильтровать базовые csv по столбцам
  • Поиск строки в нескольких ZIP-файлах
  • Найти текст в файле и скопировать его в другой файл
  • Linux и Unix - лучшая ОС в мире.