Eu gosto da idéia do grepmail (e em nossa loja nós codificamos um utilitário chamado rapgrep, requer todos os padrões , para o caso geral).
Uma resposta mais específica em termos de distância do personagem é demonstrada com este trecho, procurando palavras: country, men, time:
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE
pl " Results, egrep:"
egrep 'time|men|country' $FILE
pl " Results, egrep, with byte offset:"
egrep -b 'time|men|country' $FILE
pl " Results, egrep, with byte offset, matches only:"
egrep -o -b 'time|men|country' $FILE |
tee t1
pl " Looking for minimum distance between all pairs:"
awk -F":" '
{ a[$2] = $1 # Compare every item to the new item
for ( b in a ) {
for ( c in a ) {
# print " Working on b = ",b," c = ",c
if ( b != c ) {
v0 = a[c]-a[b]
v1 = v0 < 0 ? -v0 : v0 # convert to > 0
v2 = (b < c) ? b " " c : c " " b # trivial sort of names
print v1, v2
}
}
}
}
' t1 |
datamash -t" " -s --group 2,3 min 1
produzindo:
-----
Input data file data1:
Now is the time
for all good men
to come to the aid
of their country.
-----
Results, egrep:
Now is the time
for all good men
of their country.
-----
Results, egrep, with byte offset:
0:Now is the time
16:for all good men
52:of their country.
-----
Results, egrep, with byte offset, matches only:
11:time
29:men
61:country
-----
Looking for minimum distance between all pairs:
country men 32
country time 50
men time 18
e com um arquivo um pouco mais complicado, com várias ocorrências de algumas palavras:
-----
Input data file data2:
Now is the time men
for all good men
to come to the aid
of their men country.
-----
Results, egrep:
Now is the time men
for all good men
of their men country.
-----
Results, egrep, with byte offset:
0:Now is the time men
20:for all good men
56:of their men country.
-----
Results, egrep, with byte offset, matches only:
11:time
16:men
33:men
65:men
69:country
-----
Looking for minimum distance between all pairs:
country men 4
country time 58
men time 5
Isso faz uso da opção de contagem de bytes no GNU grep, o programa awk calcula todas as distâncias entre os pares de palavras, finalmente datamash classifica, agrupa e escolhe as distâncias mínimas.
Isso pode ser facilmente parametrizado para permitir palavras em uma linha de comando, bem como a distância permitida. Veja o arquivo t1 para o formulário nos dados de entrada para datamash do programa awk.
Executar em um sistema como:
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
bash GNU bash 4.3.30
grep (GNU grep) 2.20
awk GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)
datamash (GNU datamash) 1.2
Felicidades ... felicidades, drl