Самая длинная общая подстрока с использованием grep

Самая длинная общая подстрока с использованием grep

У меня есть огромный текстовый файл dictionary.txt с записями типа

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

В другом файле у меня есть исходный код программы, которая использует некоторые из этих сокращений как часть своих имен переменных. Имена переменных часто используют вышеуказанные записи следующим образом

     Facilitator.TMP_ABC_SEQ_NUM 

Поэтому я не могу просто искать TMP_ABC_SEQ_NUM с помощью grep, потому что это не вернет совпадений. Однако последняя часть имени переменной ("ABC_SEQ_NUM") на самом деле присутствует в текстовом файле.

Поэтому я хотел бы сказать что-то вроде

      grep (longest match for) TMP_ABC_SEQ_NUM in dictionary.txt

Так что это вернуло бы матч за

      ABC_SEQ_NUM

Как написать такую ​​команду?

решение1

Это будет попыткой сопоставления с самого начала:

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

Это позволяет найти самую длинную последовательность, независимо от того, где она начинается:

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 

требование: оболочка типа bash, доступная здесь:собственные порты win32 многих GNU-утилиты, такие как sh.exe, grep, sed, awk, bc, cat, tac, rev, col, cut, ...

решение2

Возможный подход — укорачивать строку от головки до тех пор, пока она не совпадет:

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

решение3

Не могли бы вы поменять способ рассмотрения этого вопроса? Вместо того, чтобы искать TMP_ABQ_SEQ_NUMв dictionary.txt, не могли бы вы искать первое поле для каждой строки в dictionary.txt(ABQ_SEQ_NUM) в исходном файле?

Если это так, то следующее должно сработать:

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

Передайте скрипту выше имя файла, который вы хотите проверить на последовательности, присутствующие в dictionary.txt. Извините, если это не то, что вы хотели.

Связанный контент