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つずつ印刷します。