Количество строк в строке

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

Предположим, что файл называется input.txt и он выглядит так:

 format300,format250,format300 format250,ignore,format160,format300,format300 format250,format250,format300 

Я хочу исключить строки с ignore и подсчитать количество format300 , как это сделать?

То, что у меня есть до сих пор, – это команда, которая рассчитывает только один раз за линию (что еще недостаточно):

cat input.txt | grep -v ignore | grep 'format300' | wc -l

Какие-либо предложения? Если возможно, я хочу избежать использования perl.

4 Solutions collect form web for “Количество строк в строке”

Вам не нужен первый cat , который известен как бесполезное использование кошки (UUOC) .

Кроме того, очень полезно grep -o , который выводит только совпадающие шаблоны, по одному на строку.

А затем, подсчитайте строки с wc -l .

 grep -v ignore YOUR_FILE | grep -o format300 | wc -l 

Это печатает 3 для вашего небольшого образца.

Этот однострочный лайнер должен делать то, что вы хотите:

 grep -v ignore input.txt | sed 's/format300/format300\n/g' | grep -c "format300" 

в основном вы заменяете каждое вхождение вашего ключевого слова ключевым словом и символом новой строки, что эффективно делает ваш поток ввода ключевым словом только один раз на любой заданной строке. Затем grep -c подсчитывает строки с вашим ключевым словом в них.

Перл:

 perl -lne '$k+=(s/format300//g) unless /ignore/; }{ print $k' input.txt 

s/format300//g заменит все вхождения format300 ничем и вернет количество замен. Это простой способ подсчета событий. Затем число добавляется к $k и все это происходит только в том случае, если строка не совпадает с ignore . }{ Является perl сокращением для «сделайте это после того, как вы закончите читать файл, поэтому print $k напечатает общее количество найденных.

Вводный файл может потенциально содержать частичные совпадения, которые могут привести к недействительности результата, например:

 1 format300,format250,format300 2 format250,ignore,format160,format300,format300 3 format250,format250,format300 4 format999,format300000,format999 5 format999,ignore_me_not,format300 

Вы не хотите считать format300000 в строке 4 или игнорировать строку 5, потому что ignore_me_not содержит ignore подстроки.

Это сделало бы трюк:

 grep -v "\bignore\b" FILE |grep -o "\bformat300\b"|wc -l 

Правильный выход

 4 

..безопасная строка 2 игнорируется, строка 5 – нет, а строка 4 не содержит точно format300 .

Если вы отпустите часть wc -l , вы увидите, что именно соответствует:

введите описание изображения здесь

  • Символы, видимые в vi, но не в cat.
  • Как найти пробел в тексте. используя grep?
  • Рекурсивно найти файлы по содержанию
  • Извлечь имя группы из `id` и сохранить ее в переменной
  • Есть ли способ сгладить папку и показать все строки, содержащие символы не-ascii?
  • Извлечение IP-адреса из текста и сохранение его в переменной
  • сравнить два файла и совпадения печати - большие файлы
  • регулярное выражение grep grep в команде sed
  • не жадный grep
  • Grep для нескольких строк, покажите количество строк после одной из строк (но не другой)
  • grep также возвращает не соответствующие строки
  • Linux и Unix - лучшая ОС в мире.