使用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 中存在的序列的檔案的名稱傳遞給上述腳本。如果這不是您想要的,我們深表歉意。

相關內容