我可以互相 grep 两个文件吗?

我可以互相 grep 两个文件吗?

我想对文件 B 中的每个短语进行 grep 文件 A,其中短语是长度为 X 的单词字符串。理想情况下,它将是一个近似的 grep,如 agrep。有没有办法使用命令行工具来做到这一点?

答案1

使用zsh,您可以尝试以下操作:

x=3
B_words=($(<B))
A_words=($(<A))
A="$A_words"

setopt extendedglob
for ((i = 1; i<=$#B_words - x + 1; i++)) {
  phrase=$B_words[i,i+x-1]
  [[ " $A " = (#a2)*" $phrase "* ]] && printf '%s\n' $phrase
}

这应该给你文件 B 的 3 个单词的序列,这些单词也在文件 A 中找到(允许 2 个错误(#a2))。

例如,如果A你的问题B是上面的句子,我得到:

of 3 words
3 words of
in file A

或者,如果您想查看文件中匹配的内容A

for ((i = 1; i<=$#B_words - x + 1; i++)) {
  phrase=$B_words[i,i+x-1]
  [[ " $A " = (#a2)(#b)*" "($phrase)" "* ]] &&
    printf '%s\n' "$phrase ($match[1])"
}

这使:

of 3 words (of words)
3 words of (words of)
in file A (in file B,)

这里定义为非 IFS 字符序列,默认值 $IFS 是除空格、制表符、换行符和 nul 之外的任何字符。

答案2

只要您关心整行,就可以使用 diff:

diff file1 file2 --old-line-format='' --new-line-format='' --unchanged-line-format='%L'

仅指old-line-format第一个文件中的行,格式为空白以将其省略。

仅指new-line-format第二个文件中的行,格式为空白以将其省略。

引用unchanged-line-format两个文件中的行,格式'%L'是打印出该行,包括换行符。

您可以在此处查看有关 diff 输出格式的更多信息:http://www.gnu.org/software/diffutils/manual/html_node/Line-Formats.html

答案3

很简单,只需运行cat A | grep -f BPatterna 或简单的 bash 脚本即可:

#!/bin/bash

IFS=' ' read -ra ADDR <<< $(cat "$1")

read -ra ADDR2 <<< $(cat "$2")

for i in "${ADDR[@]}"; do

    for n in "${ADDR2[@]}"; do

    if [[ "$i" -eq "$n" ]]; then

        echo $n

    fi

    done

done

并使用文件作为参数运行它./scritp.sh A B

相关内容