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와 유사한 쉘, 여기에서 사용 가능:sh.exe, grep, sed, awk, bc, cat, tac, rev, col, cut 등과 같은 많은 GNU 유틸리티의 기본 win32 포트...

답변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_NUM?dictionary.txtdictionary.txt

이 경우 다음이 작동해야합니다.

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

Dictionary.txt에 있는 시퀀스를 확인하려는 파일 이름을 위 스크립트에 전달합니다. 이것이 당신이 찾고 있던 것이 아니라면 사과드립니다.

관련 정보