3

Я хочу узнать и отобразить общее количество подстрок TTT, найденных в первых 2000 строках файла.

Я использовал grep, пока не протестировал его, и понял, что он не идентифицирует подстроки.

2 ответа2

1

Если вы ищете вхождение трех последовательных символов "T" в файле, вы можете сделать это с помощью grep. Что вы пробовали, что не сработало? И, если вы хотите проверить только первые 2000 строк файла, вы можете перенаправить вывод команды head в grep. Например, head -n 2000 somefile.txt | grep "TTT" Если вы хотите количество строк в файле, содержащем "TTT", вы можете использовать следующее:

head -n 2000 somefile.txt | grep -c "TTT"

Если в некоторых строках может быть несколько вхождений, и вы хотите сосчитать все вхождения, а не просто количество строк, содержащих "TTT", используйте параметр -o для grep, который будет отображать каждое вхождение в отдельной строке, а затем направлять вывод в команда wc, которая затем отобразит счетчик всех вхождений "TTT" в первых 2000 строках файла:

head -n 2000 somefile.txt | grep -o "TTT" | wc -l

0

объяснение

Обычно поиск TTT (3 T) в TTTTTT (6 T) дает только 2 совпадения, потому что поиск следующего совпадения выполняется сразу после того, как найдено предыдущее совпадение.

Я постараюсь проиллюстрировать:

TTTTTT
^ set starting position

TTTTTT
‾‾‾  found a match for TTT

TTTTTT
‾‾‾^ set next starting position

TTTTTT
   ‾‾‾  found a match for TTT

TTTTTT
      ^ end of stream

Решение

Если вы хотите рассмотреть TTTTTT как четыре экземпляра TTT , то я предлагаю вам сопоставить только один символ, а затем использовать lookaround для завершения вашего шаблона сопоставления.

Я буду использовать прогноз в моем решении:

head -2000 file | /usr/gnu/bin/grep -P -o 'T(?=TT)' | wc -l

Пояснения к части grep :

  • Используйте grep который поддерживает регулярное выражение Perl, чтобы использовать lookahead; в моей системе мне нужно указать это в /usr/gnu/bin/grep
  • -P активировать режим регулярного выражения Perl
  • -o отображать каждое вхождение в отдельной строке, чтобы позволить wc -l подсчитывать каждое совпадение
  • 'T(?=TT)' - это регулярное выражение для совпадения с T которым следует TT (используя предварительный просмотр); После нахождения совпадения механизм регулярных выражений запускается на втором T чтобы попытаться найти следующее совпадение, позволяя этому второму T быть частью следующего совпадения, если оно соответствует шаблону.

пример

Используя пример строки из комментария:

  • JKHFSDTTTJSDJHTTTTTKSJTIITTT

и обработать его с помощью приведенного выше регулярного выражения:

echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'

будет производить:

  • JKHFSD T TTJSDJH TTT TTKSJTII T TT (т.е. он выделит 5 T)

что значит:

  • находит 5 совпадений :)

Иллюстрация:

JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ set starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
      ‾^ found a match for T(?=TT) & set next starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
              ‾^ found a match for T(?=TT) & set next starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
               ‾^ found a match for T(?=TT) & set next starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
                ‾^ found a match for T(?=TT) & set next starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
                         ‾^ found a match for T(?=TT) & set next starting position

JKHFSDTTTJSDJHTTTTTKSJTIITTT
                            ^ end of stream

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .