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


8

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内のすべての単語を検索し、「必要な」リストwant.txtを生成することはできますか?私はスクリプトの新人であるoutput.txtに行全体が必要ですが、希望するのは次のようなものです

grep list.txt output.txt > wanted.txt

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


あなたの例のように、どちらもアルファベット順ですか?
Oli

いいえ、list.txtにアルファベット順でない特定の順序がありますが、output.txtはアルファベット順ですが、list.txtの「ヒット」のみを同じアルファベット順でない順序で含めたいです
Ditte

回答:


11

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

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

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

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

または、iiSeymourからのこの回答では、でそれを行うことができます。フラグは入力ファイルを要求し、固定文字列の全単語検索を強制します。これは注文に依存しませんが、注文に基づきます。list.txtの順にしたい場合は、ファイルを逆にします。grepoutput.txt

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

本当に大きい場合list.txtは、これをもう少し反復して取り組み、各行を個別にgrepに渡す必要があります。これにより、処理時間が大幅に増加します。上の例では、一度読んでいることになりますが、この方法では、list.txtのすべての行を読み取って処理します。それは恐ろしいです...しかし、それはあなたの唯一の選択かもしれません。逆に、それは物事を順番に並べ替えます。output.txtlist.txt

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

1
それは本当に賢いです!-12の理由は何ですか?
Ditte 2015年

3
-1最初のファイルに-2固有の行を抑制し、2番目のファイルに固有の-3行を抑制し、両方に共通の行を抑制します。共通の行だけを取得するために、一意を省略し-12ます。
Oli

いいね!commコマンドを使用すると思います。そして、output.txtをlist.txtと同じ順序に並べ替えたい場合は、後で-12 <(sort list.txt)<(sort output.txt)を使用しますか?
Ditte 2015年

commコマンドでは、result.txtの行全体が表示されませんでした(そして、そこから情報を取得するためにすべてが必要です)。しかし、grepコマンドを実行すると、grep:out of memoryが表示されます。それは大きすぎるということですか?
Ditte、2015年

2番目の例には、シェルがエラーとしてフラグを立てる冗長なSTDINリダイレクトがあります。いずれかのメイク一時ファイルや背景の並べ替えで、余分なFDを使用します(ほとんどのシェルでトリッキー)、それにパイプライン化...これは、より多くのプログラミングの質問のより良いに頼まれているスタックオーバーフロー。個人的には、これをpythonで行います。
Skaperen 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.