2つのファイルを互いにgrepできますか?

2つのファイルを互いにgrepできますか?

ファイルBのすべてのフレーズに対してファイルAをgrepしたいと思います。ここで、フレーズは長さXの単語文字列です。理想的には agrep と同様に grep に似ています。コマンドラインツールを使用してこれを行う方法はありますか?

答え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
}

これにより、ファイルAにもあるファイルBの3つの単語シーケンスが提供されます(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-format2番目のファイルの行のみを参照し、省略するには空白でフォーマットします。

改行を含む行を印刷するunchanged-line-format形式で、2つのファイルの行を引用します。'%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

関連情報