使用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 

所以我无法简单地使用 grep 搜索 TMP_ABC_SEQ_NUM,因为它不会返回任何匹配项。但是,变量名称的最后部分(“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 的 shell,可在此处获取:许多 GNU-utils 的本机 win32 端口,如 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

你能扭转一下你看待这个问题的方式吗?您是否可以不查找源文件中 (ABQ_SEQ_NUM) 中每一行的第一个字段,而不是查找TMP_ABQ_SEQ_NUMin ?dictionary.txtdictionary.txt

如果是这种情况,以下操作应该有效

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

将要检查dictionary.txt 中存在的序列的文件的名称传递给上述脚本。如果这不是您想要的,我们深表歉意。

相关内容