Как получить «нет». количество строк, совпадающих со строкой из всех файлов в папке

#unix #awk

Вопрос:

Описание проблемы:- У меня есть папка, в которой содержится так много текстовых файлов. Я хочу найти определенную строку, скажем «string_example», во всех файлах в этой папке.Затем я должен получить общее количество строк во всех файлах, в которых есть строка «string_example». Это означает,что в 1-м текстовом файле есть 5 совпадающих строк, во втором текстовом файле-10 совпадающих строк, в 3-м текстовом файле-3 совпадающие строки.Тогда результат должен быть 5 10 3=18

Что я пробовал:- Я порылся в Интернете и нашел некоторые команды, такие как

  • grep -r -n ".string_example" .

Эта команда bash выведет имя файла вместе с номером строки строк, содержащих строку «string_example».Вот пример вывода для лучшего понимания

1-й файл:1:string_example есть

1-й файл:2:string_example там нет

2-й файл:1:string_example есть

и т.д…….Но вывод act, который я хочу, равен 3 из приведенного выше вывода.

Я также попробовал еще несколько команд bash, но безрезультатно.

Мой вопрос:- Существует ли какая-либо команда bash для такого рода целей.Если нет, то как написать сценарий для следующего требования.

Пожалуйста, помогите мне

Комментарии:

1. читая ваш заголовок, я не могу понять, нужно ли вам «общее количество строк во всех файлах, которые (ссылаются на файлы) содержат(ы) строку» или общее количество строк во всех файлах, которые (ссылаются на строки) содержат(ы) строку». Из текста вашего вопроса «если в 1-м текстовом файле 5 строк» больше похоже на общее количество строк в файле, но вы, возможно, сделали многоточие, означающее «если в 1-м текстовом файле 5 совпадающих строк», поэтому я в замешательстве: вам нужно общее количество строк или общее количество совпадающих строк?

2. Спасибо за комментарий, который я отредактирую соответствующим образом!!

3. Если я ошибаюсь, я бы предложил также изменить название, используя что-то в этом духе «… общее количество совпадающих строк в …». Пока мы занимаемся этим, я не родной язык, но «все файлы, содержащие s «, разве это не странно?

Ответ №1:

grep Вы можете отправить свой запрос, чтобы получить количество строк, содержащих ваше ключевое слово wc -l :

 grep -r "string_example" . | wc -l
 

Комментарии:

1. Можете ли вы, пожалуйста, объяснить, что делает wc-l??

2. @SUDHIR: wc -l подсчитывает количество строк в данном вводе.

3. Если вы получите много выходных данных grep -r , это может быть более экономичным, так grep -hrc "string-example" . | awk '{sum = $1} END { print sum }' как тогда вывод grep будет только для каждого файла, а не для каждого попадания. С другой стороны, он будет включать ноль для каждого файла, который не содержит попадания.

4. Вам нужно --only-matching охватить возможные множественные случаи в одной строке, grep -r --only-matching "string_example" . | wc -l

5. Но grep будет отображать только один соответствующий заданный шаблон, даже если найдено несколько совпадений.

Ответ №2:

Вы также можете использовать awk для этого:

 awk '/string_example/{  c}END{print c}' *
 

c увеличивается каждый раз, когда линия соответствует шаблону. Как только все файлы будут прочитаны, выведите общее количество.

Ответ №3:

Ты хочешь чего-то подобного?

 grep -l string_example *|xargs wc -l
 

Изменить:
Вы хотите получить количество строк, совпадающих во всех файлах, или общее количество строк в файлах, содержащих совпадающие строки?

Комментарии:

1. Я хочу получить количество строк, которые совпадают во всех файлах

Ответ №4:

С помощью этой команды, данной в командной строке, вы

 % find -type f -name *.h | xargs grep -l stdlib  | xargs wc -l | awk '{a =$1} END{print a}'
16372
% 
 
  1. получите список всех файлов, здесь и ниже, заканчивающийся на .h
  2. просмотрите эти файлы, чтобы найти ссылки stdlib и с помощью опции -l распечатать только (и один раз) имена файлов, которые имеют хотя бы одно совпадение
  3. передайте список имен в wc -l
  4. используется awk для суммирования количества строк для каждого файла