他の文字列に隣接する文字列を検索しますか?

他の文字列に隣接する文字列を検索しますか?

「123456789」を検索し、「名前」に近づきたいとしましょう。それを行う方法はありますか?

私はこれを行うロジックはありません。おそらくパイプされたgrepが動作する可能性がありますか?

この目的に最適なアルゴリズムは何ですか?

入力する:

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

出力:

10本の線が互いに近いかどうかを調べて、例をsearch_string1見てください。search_string2つまり、2つの文字列が互いに隣接する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その後、2番目の項目はその行で見つかったことを確認します$context$what_we_want2*$distance+1

一致する行だけが結果として必要な場合は、-C "${distance}"2番目の行から削除してください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

関連情報