У меня есть огромный текстовый файл 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. Извините, если это не то, что вы хотели.