私は最近、「pro-」と「con-」をプレフィックスとして共有する辞書の単語について疑問に思いました。例えば、行進/譲歩、生産/指導、告白/告白、進歩/党大会などがある。デフォルトでは、一致^pro(.+)$
する単語と^con(.+)$
キャプチャグループの内容が同じ単語を探しています。
私の元の生のコマンドは次のとおりです。
sed -nr 's/^con(.+)$/\1/Ip' /usr/share/dict/words | \
xargs -I SUFFIX -n1 grep -i '^proSUFFIX$' /usr/share/dict/words
一致する「pro-」単語があるたびに、全体の「con-」単語を出力するのがうまくいくようです。問題は、速度が非常に遅いことです。潜在的な一致ごとに呼び出されるので、grep
毎回辞書全体を検索する必要があります。 up / downという単語だけを含む一時ファイルを作成して作業を高速化できますが、ファイルを作成せずにこれを実行する効率的な方法が必要です。
この種のクロス検索に最適なツールはGNUの世界にありますか?
答え1
質問自体に関する以前のコメントから:
egrep '^(pro|con).* /usr/share/dict/words | sed -nE 's/^(pro|con)(.*)/\2/p' | sort | uniq -d
proとconの接頭辞の両方を含むすべての同義語のリストを提供します。
イニシャルは、接頭辞が付いたすべてのegrep
単語をキャプチャします。次に、listを使用して各単語の先頭から合計を削除し、次のように表示します。pro
con
sed
pro
con
sort
uniq -d
オニリストに重複した項目があります。
答え2
これにより、pro|con プレフィックスのない単語が印刷されます。
grep '^\(pro\|con\)' /usr/share/dict/words | cut -c 4- | sort | uniq -c | awk '$1 == 2 {print $2}'
答え3
この特別な場合 - すべてのcon...
単語が単語の前に表示されるようにソートされた入力 - 一致するpro...
行を配列に保存するために使用できます。一致する行に達すると、結果が配列にある場合に置き換えてルートを印刷します。 :awk
^con
^pro
pro
con
awk '/^con/{arr[$0]=$0}; /^pro/{c=gensub(/pro/, "con", 1)
if (c in arr) print substr(c, 4)}' /usr/share/dict/words
… … ビンス ビンス 職業 プロフェッショナル 職業 歩行者 ウォーカード ウォーカー 電話