我可以对两个文件进行 grep 互相对照吗?

我可以对两个文件进行 grep 互相对照吗?

我想在文件 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

我认为您可以自己弄清楚模式位,因为从您的描述中我完全不清楚那应该是什么。

相关内容