다른 문자열과 인접한 문자열을 검색하시겠습니까?

다른 문자열과 인접한 문자열을 검색하시겠습니까?

"123456789"를 검색하고 "이름"에 가깝기를 원한다고 가정해 보겠습니다. 그것을 할 수 있는 방법이 있나요?

나는 이것을 할 논리가 없습니다. 아마도 파이프된 grep이 작동할 수 있을까요?

이 목적에 가장 적합한 알고리즘은 무엇입니까?

입력하다:

search_string1='firstname' search_string2='123456789'
proximity_#_of_lines=10

산출:

10개의 선이 서로 가까이 있는지 찾아보고 예를 search_string1들어 보세요. search_string2즉, 두 문자열이 서로 인접한 10줄이면 파일에 표시합니다.

답변1

표준 접근 방식은 다음과 같습니다.

what_we_want='123456789'
context='firstname'
distance=10
grep -E -e "${context}" -C "${distance}" file_to_look_into | grep -E -e "${what_we_want}" -C "${distance}"

첫 번째는 일치하는 선을 둘러싼 선만 grep보도록 보장합니다 . $distance그런 다음 두 번째 항목은 해당 행에서 발견되는지 확인합니다 $context.$what_we_want2*$distance+1

일치하는 행만 결과로 원하는 경우 -C "${distance}"두 번째 행에서 제거하세요 grep.

답변2

각 문자열이 입력에 한 번만 나타날 수 있다고 가정하고 awk(테스트되지 않음)를 사용합니다.

#!/usr/bin/env bash

awk -v str1='string1' -v str2='string2' -v prox=10 '
    index($0,str1) { nr1 = NR }
    index($0,str2) { nr2 = NR }
    nr1 && nr2 {
        delta = (nr1 > nr2 ? nr1 - nr2 : nr2 - nr1)
        exit ( delta > prox )
    }
' file

if (( $? == 0 )); then
    printf 'success\n'
else
    printf 'failure\n'
fi

관련 정보