Я хочу узнать и отобразить общее количество подстрок TTT, найденных в первых 2000 строках файла.
Я использовал grep, пока не протестировал его, и понял, что он не идентифицирует подстроки.
Если вы ищете вхождение трех последовательных символов "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
Обычно поиск 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
быть частью следующего совпадения, если оно соответствует шаблону.Используя пример строки из комментария:
и обработать его с помощью приведенного выше регулярного выражения:
echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'
будет производить:
что значит:
Иллюстрация:
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