別のテキストファイルに表示される1つのテキストファイル内のすべての単語を検索する

別のテキストファイルに表示される1つのテキストファイル内のすべての単語を検索する

a.txt2つのファイルがあり、その中にあるすべての単語をb.txt探したいとしましょう。a.txtb.txt

これを行う特定のコマンドはありますか?

答え1

bashそして以下を使用するzshいくつかの実装ksh

comm -12 <(tr -s '[:space:]' '[\n*]' < a.txt | sort -u) \
         <(tr -s '[:space:]' '[\n*]' < b.txt | sort -u)

そこ、言葉空白以外の文字のシーケンスです(GNUの場合、trマルチバイト空白文字では機能しません)。

comm2つのソートされたファイル間の共通行を見つけます。オプションがないと、3つの列(file1にのみある行、file2にのみある行、両方に共通の行)が印刷されます。出力からその列を削除するには-1-2を追加します。-3したがって、comm -123番目の列(共通線)のみが残ります。

tr -s '[:space:]' '[\n*]' ティーどんなピンインでもSクラス文字シーケンスはspaceそれぞれをラップします。言葉独自のラインで。

sort -utr出力をソートし、重複項目を削除します。

プロセスの置き換え<(...)は、コマンド出力tr|sortcomm


そしてzsh

w1=($(<a.txt)) w2=($(<b.txt))
print -rl -- ${(u)${w1:*w2}}

そこ、言葉スペース、タブ、nul、および改行以外の文字シーケンスです(デフォルトは$IFS)。

$(<a.txt)$(cat a.txt)zshwhereを呼び出さずにファイルの内容自体を読み取ることができる最適化されたバージョンcat。引用しないので、単語分割を実行します(ただし、他のシェルとは異なり、ワイルドカードを実行しません)。

したがって、sumは合計のすべての単語をw1含む配列です。w2a.txtb.txt

${w1:*w2}2つの配列(2つの配列に共通の要素)の交点を提供するzsh演算子。(u)一意の要素を保持(重複排除)するパラメータ拡張フラグ。

print -rl各引数を1行に1つずつ印刷します。

答え2

# Create dummy text file containing two words
$ echo -e "overflow\ngrep" > b
# Search in file for lines containing one word from file b
$ grep --color --fixed-strings --file b /usr/share/dict/words

私のシステムの結果:

overflow
overflow's
overflowed
overflowing
overflows

次へ追加--一致のみ(-o)引数は、その単語が出てくる完全な行ではなく、単語だけを取得します。

答え3

ファイル内の単語がLFで区切られ、単語が「nice」文字のみで構成され、b.txtに最後のLFがないと仮定すると、次のようになります。

egrep `tr '\n' '|' < b.txt` a.txt

成功することもできます。

答え4

単語レベルでは機能しませんが、行レベルではさらに機能しますが、これはあなたや答えを探している他の人に役立ちます。

diff --left-column --from-file=a.txt --to-file=b.txt

a.txtファイルとb.txtファイルを比較し、共通行のみを出力します。

関連情報