다음 항목이 포함된 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.txt
dictionary.txt
이 경우 다음이 작동해야합니다.
#!/bin/bash
for i in $(awk '{print $1}' dictionary.txt) do
grep $i $1
done
Dictionary.txt에 있는 시퀀스를 확인하려는 파일 이름을 위 스크립트에 전달합니다. 이것이 당신이 찾고 있던 것이 아니라면 사과드립니다.