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_NUM
in 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.