Substring comum mais longa usando grep

Substring comum mais longa usando grep

Eu tenho um arquivo de texto enorme chamado dicionário.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, tenho a fonte de um programa que usa algumas dessas abreviações como parte de seus nomes de variáveis. Os nomes das variáveis ​​geralmente usam as entradas acima da seguinte forma

     Facilitator.TMP_ABC_SEQ_NUM 

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

Então eu gostaria de dizer algo como

      grep (longest match for) TMP_ABC_SEQ_NUM in dictionary.txt

Para que retornasse a partida para

      ABC_SEQ_NUM

Como escrever tal comando?

Responder1

Isso tentaria corresponder desde o início:

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 semelhante ao bash, disponível aqui:portas win32 nativas de muitos utilitários GNU, como sh.exe, grep, sed, awk, bc, cat, tac, rev, col, cut, ...

Responder2

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

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

Responder3

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

Se for esse o caso, o seguinte deve funcionar

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

Passe ao script acima o nome do arquivo que deseja verificar as sequências presentes no dicionário.txt. Desculpas se não era isso que você queria.

informação relacionada