![다른 문자열과 인접한 문자열을 검색하시겠습니까?](https://linux55.com/image/224600/%EB%8B%A4%EB%A5%B8%20%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC%20%EC%9D%B8%EC%A0%91%ED%95%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
"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_want
2*$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