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

Если Вы находитесь на Linux, Вы можете:

  • Смонтируйте свою корневую файловую систему на случайной точке монтирования. Я обычно использую /mnt для этого вида вещей.

    mount --bind / /mnt
    
  • Затем Вы можете (ре) перемещать файлы от /mnt/var

Не вся ОС позволяет файловую систему, смонтированную на второй точке монтирования одновременно, вот почему я записал 'на Linux'. Просто попробуйте монтирование, оно ничего не повредит.

3
10.07.2013, 22:55
3 ответа

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

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

\> в конце regex гарантирует, что соответствие остановится на "границе слова" для предотвращения ложных аварийных сигналов, таких как строки, запускающиеся с 20 вместо 2.

Примечание:

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

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 переключатель необходим для включения расширенных регулярных выражений, который позволяет Вам использовать {} нотация для определения числового квантора (т.е. 'соответствуют предыдущему шаблону это много раз').

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

4
27.01.2020, 21:14
  • 1
    Спасибо! я добирался больше, потому что это также считало строки, которые имели другие значения (20, например), это запустилось с 2, но я зафиксировал его с grep - туалет –  Rebe 10.07.2013, 23:22
  • 2
    @Rebe Отредактированный ответ для создания условия для этого в regex. –  Joseph R. 10.07.2013, 23:31
  • 3
    @Rebe необходимо отметить, что это решение не масштабируется хорошо как find управляйте потребностями перечислить все файлы перед grep начинается. При рассмотрении большого количества файлов конвейерные решения в других ответах являются, вероятно, более подходящими для Вас. –  Joseph R. 10.07.2013, 23:36
  • 4
    Можно ли использовать grep для нахождения значения в другом столбце и не только в начале строки? –  Rebe 11.07.2013, 00:01
  • 5
    @Rebe Дает мне больше информации: "столбцы" составлены из цифр только? Действительно ли мы уверены, что столбцы разграничены пробелом только? –  Joseph R. 11.07.2013, 00:02

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

  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}'
    
2
27.01.2020, 21:14
  • 1
    Первый работает отлично. Второй не то, что я действительно ищу, но хорошо знать, что ho делает это.Спасибо! –  Rebe 11.07.2013, 00:15
  • 2
    И мне нравится этот, это использует awk, таким образом, я могу использовать его для других столбцов! –  Rebe 11.07.2013, 00:16

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

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

Если Вы хотите свой вывод ПЕЧАТИ:

$ grep "^2" *|awk '{print $1}'|uniq -c|sed 's/:2//'|awk '{print $2, $1}'
FILE_1 2
FILE_2 3
0
27.01.2020, 21:14
  • 1
    @Rebe - да это менее эффективно, но легче следовать. –  slm♦ 11.07.2013, 00:24

Теги

Похожие вопросы