Использование awk.Я не думаю, что это будет медленнее, чем grep
, но оно не молниеносно (хотя и не проверялось ни с чем, кроме предоставленных образцов):
awk 'NR==FNR{
a[$0] # hash search strings to a
next
}
{
print ++c ". string:" # 1. is string, 2. is string reversed
b=$0 # string to b
for(i in a) { # loop all search words
k=1 # reset index
while(j=index(substr(b,k),i)) { # search
print i,k+j-1 # output search word and index
k=k+j
}
}
}' list profile <(rev profile)
Вывод:
1. string:
BEEBB 16
EEEEE 9
EEEEE 10
2. string:
BEEBB 4
BBBBEE 1
EEEEE 9
EEEEE 10
Он использует команду rev
для изменения профиля (и bash).
Обновление :
Я протестировал решение grep в OP, решение perl @ stack0114106 и мой awkс 120000 символами случайных B и Es в profile
и 1000 предметов длиной 10-50 в list
:
OP (лучшее время из трех для всех):
hits: 4506
real 0m3.977s
user 0m1.500s
sys 0m0.436s
GNU awk (без rev
):
4511
real 0m2.576s
user 0m2.576s
sys 0m0.000s
Mawk (без оборотов):
4511
real 0m1.694s
user 0m1.692s
sys 0m0.000s
Perl:
4511
real 0m10.371s
user 0m10.360s
sys 0m0.008s