Точный поиск в массиве AWK - PullRequest
0 голосов
/ 27 апреля 2018

Кто-нибудь может предложить некоторую помощь, чтобы этот AWK правильно искал?

Мне нужно найти в файле "sample.txt" все 6 элементов массива в файле "комбинаций". Тем не менее, мне нужно, чтобы поиск происходил по каждому отдельному символу, а не по типу обычного поиска в текстовом редакторе, который выполняет поиск по блокам после каждого вхождения. Мне нужно искать в наиболее сжатом виде, чтобы отображать точно каждый раз, когда это происходит. Например, мне нужен тип поиска, который находит внутри строки «AAAAA» комбинацию «AAA», происходящую 3 раза, а не 1 раз. См. Мой предыдущий пост об этом: BASH: поиск строки и точное отображение точного числа случаев, когда подстрока происходит внутри нее

Файл sample.txt:

AAAAAHHHAAHH

Файл комбинаций:

AA  
HH  
AAA  
HHH  
AAH  
HHA  

Как мне получить скрипт

#!/bin/bash
awk 'NR==FNR {data=$0; next} {printf "%s %d \n",$1,gsub($1,$1,data)}' 'sample.txt' combinations > searchoutput

для вывода желаемого результата:

AA 5
HH 3
AAA 3
HHH 1
AAH 2
HHA 1 

вместо того, что выводится в данный момент:

AA 3 
HH 2 
AAA 1 
HHH 1 
AAH 2 
HHA 1 

Как мы видим, скрипт только находит комбинации, как текстовый редактор. Мне нужно, чтобы он искал комбинации с начала каждого символа, чтобы получить желаемый результат.

Как получить вместо AWK желаемый вывод? Не могу отблагодарить вас достаточно.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы можете попробовать это:

$ awk '{x="AAAAAHHHAAHH"; n=0}{
    while(t=index(x,$0)){n++; x=substr(x,t+1) } 
    print $0,n
}' combinations.txt 
AA 5
HH 3
AAA 3
HHH 1
AAH 2
HHA 1
0 голосов
/ 27 апреля 2018

может быть более быстрый способ найти первое совпадение и перенести его из этого индекса, но это может быть проще

$ awk 'NR==1{content=$0;next} 
            {c=0; len1=length($1); 
             for(i=1;i<=length(content)-len1+1;i++)
                c+=substr(content,i,len1)==$1;
             print $1,c}' file combs

AA 5
HH 3
AAA 3
HHH 1
AAH 2
HHA 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...