Intereting Posts
сопоставить массив аргументов, а затем преобразовать в строку Как настроить меньше для чтения неиспользуемых данных в буфер? эвристически найти, как различный набор файлов Почему Arch Linux не отключает наушники Windows изменить права доступа к домашней папке при выходе / отключении Прерывания Linux Не удалось выполнить ssh в Ubuntu 12.04 LTS [не удалось разрешить имя хоста (имя хоста): имя или услуга неизвестны Установка VMWare на Arch Linux exec cp не работает из сценария, но работает при выпуске напрямую Перенос Ubuntu на жесткий диск большего размера Почему остановка systemctl запрашивает пароль, а перезагрузка systemctl и отключение systemctl? Ubuntu автоматически подключается к беспроводной сети, когда она уже подключена eth0 к той же сети Где хранится пароль для аутентификации ssh? Замена номера одним и тем же значением (числом) одного символа Какой драйвер используется беспроводным адаптером USB?

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

У меня 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 , вы можете использовать следующее:

 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