我想在文件 A 中 grep 文件 B 中的每个短语,其中短语是长度为 X 的字符串。理想情况下,它将是一个近似的 grep,例如agrep
。有没有办法使用命令行工具来做到这一点?
文件 A:
“曾经我听过一个关于太空香蕉的故事。”
文件 B:
“如果有一件事我不担心,那就是太空中的香蕉。”
输出:
在文件 A 第 1 行、文件 B 第 1 行中找到短语“太空中的香蕉”。
(它可能会像 grep 一样在上下文中突出显示短语。)
答案1
您可以在 bash 中尝试以下操作:
while read line
do
grep "$line" fileA
done < fileB
答案2
您希望通过任何命令行工具执行的操作,都可以通过具有全文搜索功能的程序完成。使用 awk 可以完成更少的事情:
$ cat fts.awk
{ gsub( /[[:space:],."!?]+/, " ") }
FILENAME == "A" {
A[++cntA] = $0
next
}
FILENAME == "B" {
for ( nrA=1; nrA<=cntA; ++nrA) {
for ( first=1; first<=NF; ++first) {
for ( last=first; last<=NF; ++last) {
lookfor = (last == first) ? $first : lookfor " " $last
#print "lookfor=", lookfor
#print "<", A[nrA]
if ( index(A[nrA], lookfor)) {
#print "FOUND>", found, nrA, NR
found = lookfor
} else if (found) {
printf "Phrase \"%s\" found in File A line %d, file B line %d.\n",\
found, nrA, FNR
found = ""
break
}
}
}
}
}
也可以这样调用:
$ awk -f fts.awk A B
Phrase "bananas in space" found in File A line 1, file B line 1.
Phrase "in space" found in File A line 1, file B line 1.
Phrase "space" found in File A line 1, file B line 1.
正如您所看到的,代码已经变得复杂,虽然它几乎没有实现您列出的任何功能,但它甚至没有内存来消除显示子发现。
答案3
让我们稍微简化一下,然后再建立解决方案。
您可以使用 -f 选项从文件中 grep 具有模式的文件。因此,您可以执行类似以下操作。
grep -f file_patterns file_haystack
您可以使用进程替换使进程的输出像文件一样
cat <( grep pattern file )
如果将它们放在一起,您可以根据这样的 grep 命令的输出来 grep 一个文件。
grep -f <( grep pattern file_a ) file_b
我认为您可以自己弄清楚模式位,因为从您的描述中我完全不清楚那应该是什么。