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와 유사한 쉘, 여기에서 사용 가능: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

당신이 이것을 보는 방식을 바꿀 수 있습니까? TMP_ABQ_SEQ_NUM에서 찾는 대신 소스 파일에서 (ABQ_SEQ_NUM) dictionary.txt의 각 줄에 대한 첫 번째 필드를 찾을 수 없습니까 ?dictionary.txt

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

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

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

관련 정보