a.txt
2つのファイルがあり、その中にあるすべての単語をb.txt
探したいとしましょう。a.txt
b.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
マルチバイト空白文字では機能しません)。
comm
2つのソートされたファイル間の共通行を見つけます。オプションがないと、3つの列(file1にのみある行、file2にのみある行、両方に共通の行)が印刷されます。出力からその列を削除するには-1
、-2
を追加します。-3
したがって、comm -12
3番目の列(共通線)のみが残ります。
tr -s '[:space:]' '[\n*]'
ティーどんなピンインでもSクラス文字シーケンスはspace
それぞれをラップします。言葉独自のラインで。
sort -u
tr
出力をソートし、重複項目を削除します。
プロセスの置き換え<(...)
は、コマンド出力tr|sort
をcomm
。
そしてzsh
:
w1=($(<a.txt)) w2=($(<b.txt))
print -rl -- ${(u)${w1:*w2}}
そこ、言葉スペース、タブ、nul、および改行以外の文字シーケンスです(デフォルトは$IFS
)。
$(<a.txt)
$(cat a.txt)
zsh
whereを呼び出さずにファイルの内容自体を読み取ることができる最適化されたバージョンcat
。引用しないので、単語分割を実行します(ただし、他のシェルとは異なり、ワイルドカードを実行しません)。
したがって、sumは合計のすべての単語をw1
含む配列です。w2
a.txt
b.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ファイルを比較し、共通行のみを出力します。