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

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

Предположим, что файл называется 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 , вы увидите, что именно соответствует:

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

  • захватить текст из файла vtt
  • Найти первое появление каждого из этих шаблонов с помощью grep
  • Может grep вернуть true / false или есть альтернативные методы
  • Как я могу использовать grep для поиска нескольких неназванных каталогов?
  • Есть ли архив старых страниц? специально для функций, доступных для grep в раннем 'ed'
  • Как grep файл в точке монтирования smb без использования mount или fstab?
  • Удалить пробелы после определенного символа
  • Найти файлы, которые не находятся в .gitignore
  • Как просмотреть все записи syslog
  • Как получить несколько строк из файла с помощью регулярных выражений?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Interesting Posts

    Как получить список длинных процессов, соответствующих определенному шаблону?

    Как скрипт / etc / issue?

    Отображение всех скриптов инициализации sysvinit

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

    Как эффективно использовать GNU-параллель

    Как проверить, какой сетевой интерфейс активен и предоставляет интернет?

    Как безопасно отменить поиск dns на ip в сценарии оболочки

    Могу ли я сказать, чтобы найти, чтобы не восстановить исходный рабочий каталог?

    В чем разница между «* .pl» и * .pl в grep? Почему цитирование изменяет результат?

    Задачи отображения в календаре оболочки GNOME

    Настройка smartmontools

    Трубопроводы, рабочие места и процессы в Zsh

    GNOME 3 Ctrl + Alt + D (показать рабочий стол)

    Как получить семафоры и объекты sharedmem для определенного экземпляра apache, когда несколько экземпляров Apache запускаются с одним и тем же идентификатором приложения в ящике

    Scp удаленных файлов на локальный

    Linux и Unix - лучшая ОС в мире.