Maior substring comum usando grep

3

Eu tenho um arquivo de texto enorme chamado dictionary.txt com entradas como

    ABC_SEQ_NUM This represents....
    ABC_RANK This represents....
    ABC_BSC_ID This represents...
    PQR_TA_DATE_AF This represents...
    XYZ_C_ID This represents...

Em outro arquivo, eu tenho a fonte de um programa que está usando algumas dessas abreviações como parte de seus nomes de variáveis. Os nomes das variáveis geralmente usam as entradas acima da seguinte maneira

     Facilitator.TMP_ABC_SEQ_NUM 

Portanto, não posso simplesmente pesquisar por TMP_ABC_SEQ_NUM usando o grep, porque ele não retornaria correspondência. No entanto, a última parte do nome da variável ("ABC_SEQ_NUM") está realmente presente no arquivo de texto.

Então, gostaria de dizer algo como

      grep (longest match for) TMP_ABC_SEQ_NUM in dictionary.txt

Para que retornasse a correspondência para

      ABC_SEQ_NUM

Como escrever tal comando?

    
por CodeBlue 02.04.2012 / 16:11

3 respostas

3

Isso tentaria combinar desde o começo:

t=TMP_ABC_SEQ_NUM
for n in $(seq 0 ${#t})
do
  grep ${t:n} dictionary.txt && break
done

Isso procura a sequência mais longa, não importa onde ela comece:

for len in $(seq ${#t} -1 3)
do
   for start in $(seq 0 $((${#t}-len)))
   do
       grep ${t:start:len} dictionary.txt && break 2
   done
done 

requisito: Um shell tipo bash, disponível aqui: portas win32 nativas de vários utilitários GNU, como sh.exe, grep, sed, awk , bc, gato, tac, rev, col, corte, ...

    
por 03.04.2012 / 01:50
2

Uma possível abordagem, para encurtar a corda da cabeça até que ela corresponda:

#!/bin/sh
string="TMP_ABQ_SEQ_NUM"
while ! grep "$string" dictionary.txt; do 
  # remove the shortest leading string ending with "_"
  string="${string#*_}"
done
    
por 02.04.2012 / 16:23
0

Você poderia reverter a maneira como está vendo isso? Em vez de procurar TMP_ABQ_SEQ_NUM in dictionary.txt , você não poderia procurar o primeiro campo para cada linha em dictionary.txt (o ABQ_SEQ_NUM) no arquivo de origem?

Se este for o caso, o seguinte deve funcionar

#!/bin/bash
for i in $(awk '{print $1}' dictionary.txt) do
    grep $i $1
done

Passe o script acima para o nome do arquivo que você quer verificar por sequências presentes em dictionary.txt. Desculpas se não é isso que você queria.

    
por 03.04.2012 / 14:48