假设我想搜索“123456789”,并且希望它靠近“名字”。有办法做到吗?
我有 0 逻辑来做这件事。也许管道 grep 可以工作?
哪种算法最适合此目的?
输入:
search_string1='firstname' search_string2='123456789'
proximity_#_of_lines=10
输出:
查找search_string1
并search_string2
举例说明它们是否有 10 条线彼此靠近。即,如果这两个字符串彼此相邻 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}"
从第 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