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
私はこれの例を見つけることができませんでした
これについては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.txt
がreally大きい場合、これにもう少し繰り返し取り組み、各行を個別に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