web-dev-qa-db-ja.com

単語のリストを使用して、他のリストでgrepします

250行のリストがあります。出力のリストを取得するには、すべてをWebサーバーで実行する必要があります。ただし、このリストは、私が興味を持っているよりも多くの行を返します。たとえば、私のlist.txtは次のとおりです。

a.1
b.1
etc

出力はoutput.txtです:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Grepコマンドを使用して、output.txt内のlist.txt内のすべての単語を検索し、「必要な」リストのwanted.txtを生成することは可能ですか? output.txtの行全体が必要です。スクリプトを書くのは初めてですが、私が望むのは次のようなものです。

grep list.txt output.txt > wanted.txt

私はこれの例を見つけることができませんでした

8
Ditte

これについてはgrepを無視します。正規表現には適していますが、ここでは本当に必要なようには見えません。 commは、2つのファイルを比較して交差点を表示できます。正確な例を使用して:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

これはどのgrepよりも高速ですが、ソートされるファイルに(大きく)依存しています。そうでない場合は、事前に並べ替えることができますが、それによって出力も変更され、並べ替えられます。

comm -12 <(sort list.txt) <(sort output.txt) 

または、 この答え from iiSeymour を使用すると、grepで実行できます。フラグは入力ファイルを要求し、固定文字列のフルワード検索を強制します。これは順序に依存しませんが、output.txt順序に基づきます。 list.txtの順序でファイルが必要な場合は、ファイルを逆順にします。

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

list.txtreally大きい場合、これにもう少し繰り返し取り組み、各行を個別にgrepに渡す必要があります。これにより、処理時間が大幅に増加します。上記ではoutput.txtを1回読むことになりますが、この方法ではlist.txtのすべての行でそれを読んで処理します。それは恐ろしいです...しかし、それはあなたの唯一の選択肢かもしれません。良い面としては、list.txt順でソートします。

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc
11
Oli