ファイル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-format
2番目のファイルの行のみを参照し、省略するには空白でフォーマットします。
改行を含む行を印刷するunchanged-line-format
形式で、2つのファイルの行を引用します。'%L'
diff 出力形式の詳細については、こちらをご覧ください。http://www.gnu.org/software/diffutils/manual/html_node/Line-Formats.html
答え3
簡単です。cat A | grep -f B
Patternaや単純な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