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

У меня 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 
  • Обзор результатов GREP и FIND в Xemacs
  • Почему команда «find | grep 'filename' 'намного медленнее, чем «найти« имя файла »?
  • Поиск строки в файлах в текущем каталоге, опустить дубликаты
  • Есть ли программа поиска / порт поиска контента (* not * index based), которая эффективна для файлов, требующих фильтров для извлечения текста
  • Как выполнить grep на FTP?
  • Найти файлы между двумя папками в linux?
  • Может ли grep использоваться для поиска файлов с некоторой строкой в ​​их именах?
  • Есть ли html-поиск / поисковик документов, например, служебная информация для информационных файлов?
  • Как разбирать файл с конца в awk
  • Поиск строки в нескольких ZIP-файлах
  • Попытка использовать `pwd` внутри псевдонима, дающего неожиданные результаты
  • Linux и Unix - лучшая ОС в мире.