入力ファイルの順序でgrep出力を生成するには?

入力ファイルの順序でgrep出力を生成するには?

scrambledA.txt私のリストには次のデータがあります。

efrrsu
aehmmr
aeeglnr
alnors
acflno
aaahmy
aceimru
1469en
aelprsy
cehrry

そして、wordlistC.txt多くのキーと値のペアを含む対応は次のとおりです。

...-...
...-...
1469en-ne1469
aaahmy-yamaha
aceimru-maurice
acflno-falcon
aeeglnr-general
aehmmr-hammer
aelprsy-players
alnors-larson
cehrry-cherry
efrrsu-surfer
...-...
...-...

scrambledA.txtmyをの正しい単語と一致させようとしていますwordlistC.txt。まず試しました

grep -f scrambledA.txt wordlistC.txt | cut -d'-' -f2

scrambledA.txtただし、必要な順序で出力は提供されません。それからforループを使って何かをする必要があると思いましたが、うまくいくことはできませんでした。私が何を間違っているのでしょうか?

for line in $(cat "scrambledA.txt")
do
    #grep -f "$line" wordlistC >> scrambledBB.txt
    #echo $line | grep -f wordlistC.txt >> scrambledBBB.txt
done

予想される出力は次のとおりです。

surfer
hammer
general
larson
falcon
yamaha
maurice
ne1469
players
cherry

ベストアンサー1

厳密に言えば、はい入力ファイルに表示される順序で単語を取得します。単に「入力ファイル」がgrep混在した単語リストではなく、単語リストファイルというだけです。

grep現在のオプションと一緒に提供するのは-f混在した単語のリストですが、実際に一致させるパターンではありません。一致させるパターンは、単語リストファイルのキー(-各行の最初の文字列の前の文字列)です。あなたは一致したいですそれらスクランブルされたファイルの単語を比較して、対応するスクランブルされていない文字列を見つけます。

awk単語リストを連想配列として読み取った後、その配列の間違ったファイルから各行について読み取った単語を見つけると、これはかなり簡単になります。

$ awk -F - '!wordlist_processed { dict[$1]=$2; next }
            { print $0 in dict ? dict[$0] : "UNKNOWN WORD" }
           ' wordlistC.txt wordlist_processed=1 scrambledA.txt
surfer
hammer
general
larson
falcon
yamaha
maurice
ne1469
players
cherry

UNKNOWN WORDまた、単語リストにキーとして表示されない混乱した単語の文字列も追加で印刷されます。

まったく異なるアプローチは、単語リストをスクリプトに変換し、sed入力の単語を置き換えることです。

$ sed 's,\([^-]*\)-\(.*\),s/^\1$/\2/;t,' wordlistC.txt | sed -f /dev/stdin scrambledA.txt
surfer
hammer
general
larson
falcon
yamaha
maurice
ne1469
players
cherry

最初のsedコマンドはスクリプトを生成し、2番目のコマンドはsedスクランブルされた単語に適用します。質問の例(...-entriesが削除されました)を考えると、スクリプトは次のようになります。

s/^1469en$/ne1469/;t
s/^aaahmy$/yamaha/;t
s/^aceimru$/maurice/;t
s/^acflno$/falcon/;t
s/^aeeglnr$/general/;t
s/^aehmmr$/hammer/;t
s/^aelprsy$/players/;t
s/^alnors$/larson/;t
s/^cehrry$/cherry/;t
s/^efrrsu$/surfer/;t

(単語リストの単語をそのまま使用しています。つまり、キーは正しい正規表現でなければならず、混在しない単語は置換コマンドの右側に含まれるように有効でなければなりません。sed

ご覧のとおり、各置換は、1行で個別に混在した特定の単語と一致し、それを混在させない単語に置き換えます。置換が行われると、各置換の後のベアコマンドはtスクリプトの最後に分岐します。これは入力ラインでの複数の置換を防ぐためです。

上記の両方の方法は、復号化するために混乱した単語に「単語リストを適用」します。その逆ではなく、それがあなたの質問でやっていることです。

おすすめ記事