Сколько раз была найдена буква «N» или ее повторение (например, «NNNNN») в текстовом файле? - PullRequest
1 голос
/ 23 сентября 2019

Мне дан файл file.txt (текстовый файл) со строкой данных.Содержание примера:

abcabccabbabNababbababaaaNNcacbba                                                              
abacabababaaNNNbacabaaccabbacacab                                                   
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN                                                    
aaababababababacacacacccbababNbNa                                                     
abababbacababaaacccc         

Чтобы найти количество различных повторяющихся шаблонов "N" (повторяющихся один или несколько раз), присутствующих в файле с помощью команд unix.

Я не уверенкакие команды использовать даже после попытки выбора различных команд.

$ grep -E -c "(N)+" file.txt

вывод должен быть 6

Ответы [ 4 ]

3 голосов
/ 23 сентября 2019

Использование GNU awk (ну, только что протестировано с gawk, mawk, busybox awk и awk версии 20121220 и, похоже, оно работает со всеми из них):

$ gawk -v RS="^$" -F"N+" '{print NF-1}' file
6

Читается во всем файле какодиночная запись, использует регулярное выражение N+ в качестве разделителя полей и выводит число полей минус один.Для других awk:

$ awk -v RS="" -F"N+" '{c+=NF-1}END{print c}' file

Читает в пустой строке разделенные блоки записей, счетчиков и полей сумм.

3 голосов
/ 23 сентября 2019

В одну сторону:

$ sed 's/[^N]\{1,\}/\n/g' file.txt | grep -c N
6

Как это работает:

  • Заменить все последовательности одного или нескольких не N символов во вводе новой строкой.Это превращает строки типа abcabccabbabNababbababaaaNNcacbba в

    N

    NN

  • Подсчет количества строк хотя бы с одним N (игнорируя пустые строки).


Альтернатива без регулярных выражений:

$ tr -sc N ' ' < file.txt | wc -w
6

Использует tr для замены всех серий не-N символов одним пробелом, исчитает оставшиеся слова (которые являются N последовательностями).Возможно, даже не нужна опция -s.

1 голос
/ 23 сентября 2019

Вот awk, который должен работать в большинстве систем.

awk -F'N+' '{a+=NF-1} END {print a}' file
6

Он разбивает строку на один или несколько N, а затем подсчитывает количество полей-1 или строку.

0 голосов
/ 24 сентября 2019

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

awk '{a+=gsub(/N+/,"")}END{print a}' file

Это, однако, будет различать последовательности, которые разбитынесколько строк.Пример:

abcNNN
NNefg

Если вы хотите, чтобы это считалось как одна последовательность, вы должны сделать:

awk 'BEGIN{RS=OFS=""}{$1=$1}{a+=gsub(/N+/,"")}END{print a}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...