ファイルからgrepパターンを読み取る


49

いくつかの大きなテキストファイルがあり、そのファイルUNIQS.txtにはgrep別のファイルからの文字列のリストがあります。私が使用するコードは

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

何もしません-生成されたファイルは空です。しかし、私がするとき

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

正しく機能します。これは、ファイル内にクォートやスラッシュなどのない正規表現パターンとしてgrepエントリを解釈するとは思わなかったので、私を混乱させUNIQS.txtます(そうではありません)。一般に、ファイルからパターンを取得している場合、正規表現パターンであると自動的に判断されるのでしょうか?

編集:ではUNIQS.txt、ファイル、フォームの改行で区切られた文字列があります

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(テンプレート名と呼ばれます)およびファイルEEP_VSL...タブで区切られた列で、約14列と最初の列がテンプレート名であるため、基本的にファイル内の各テンプレートに対応する行を抽出します。

回答:


60

この-fオプションは、grepがパターンを読み取るファイルを指定します。これは、コマンドラインでパターンを渡すのと同じです(-e複数ある場合はオプションを使用します)。ただし、シェルから呼び出すときは、パターンを引用符で囲む必要があり、その特殊文字がシェルによって展開されないようにします。

引数-Eor -Fまたは-P(ある場合)は、grepにパターンが記述されている構文を伝えます。引数がない場合、grepは基本的な正規表現を期待します。で-E、grepは拡張正規表現を期待します。-P(サポートされている場合)、grepのを期待は、正規表現をPerlの。そして-F、grepはリテラル文字列を期待します。パターンがコマンドラインから来たのかファイルから来たのかは関係ありません。

文字列は部分文字列であることに注意してください。a+bパターンとして渡すと、含む行a+b+cが一致します。指定された文字列の1つだけを含む行を検索する場合は、-xオプションを渡します。


1
わかりました、ありがとうございます。文字列を正確に一致させたい場合、つまり、文字列が12345である場合、123456や123455などではなく12345のみで一致させたい場合、どうすればよいでしょうか?
自衛隊

2
@sdf私の最後の段落を読む:-x
ジル「SO-停止ビーイングの悪」

これはとても古いので、掘り下げてごめんなさい。上記の説明はすばらしいですが、ファイルからのパターン(文字列)がフラグなしで一致しない理由については少しあいまい-Fです。私の推測では、-上記のサンプル行では、これは一連の文字として読み取られますか?角括弧も必要ではないでしょうか?いくつかのサンプルファイルでテストしましたが、結論に達していません。
trs

@trs質問(回答を投稿した後に追加された)に示されている行には、正規表現で特別な意味を持つ文字が含まれていないため、withとwithoutで同じように動作し-Fます。のような文字では違いが生じ\[*^$ます。
ジル「SO-悪であるのをやめる」

@Gillesのおかげで、それも私の印象でしたが、@ sdfは-Fフラグなしで「生成されたファイルは空です」(読み取り:一致なし)と主張していますか?
16

0

私は同じエラーを抱えていましたが、@ gillesからの良い答えでは解決しませんでした。入力ファイルをよく見ると、最後に2つの改行が見つかりました。これらがなければ、成功、必要なのはgrep -i file_pattern_input file

(GNU grep 3.1、入力ファイル5000件を超えるレコード、マッチング/パターンファイル2536、すべての2536がファイル内に存在する必要があることはわかっていました。


1
それはOPの問題とは無関係です。空の行はgrepによって空のパターンとして読み取られ、空のパターンはどこでも一致します。
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.