「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_want
2*$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