grep は前の grep を出力します。

grep は前の grep を出力します。

grepあるファイル実行の複数行出力を別のファイルの後続の2番目の実行パターンとして使用できますか?grep

例:

  • コンテンツfile1.txt
    2 blue
    1 red 
    1 green
    2 black
    2 orange
    
  • コンテンツfile2.txt
    2 blue triangle
    2 blue circle
    3 blue triangle
    2 red triangle
    3 green circle
    4 red square
    2 orange circle
    2 brown circle
    
  • 最初の結果grep
    $ grep 2 file1.txt 
    
    2 blue 
    2 black
    2 orange
    

今、私は次のコマンドを探しています。

grep <PREVIOUS OUTPUT> file2.txt

file2.txtこれにより、次のコマンドを実行して生成された行の1つで始まるすべての行を見つけることができます。grepfile1.txt

2 blue triangle
2 blue circle
2 orange circle

ベストアンサー1

これが質問に対する答えです言葉質問。これをよりよく解決するための答えについては、awk以下の「説明」の解決策を参照してください。

で見つかったパターンが行file1.txtの先頭でのみ発生する可能性があると仮定すると、このフラグを使用してコマンドラインで正規表現として宣言するのではなく、ファイルから複数の検索パターンを読み取ることができますfile2.txt-fその後、このファイルを最初の実行の出力に接続する必要がありますgrep

一つの方法はプロセスの交換:

grep -F -w -f <(grep -w 2 file1.txt) file2.txt
  • この<( ... )構成は、角かっこで囲まれたコマンドの出力を、まるでファイルのように使用できるようにします。
  • この-Fフラグは、完全正規表現検索を無効にし、grep最初の実行の出力に正規表現コンテキストで特別な意味を持つ文字を含めることができる場合に備えた安全対策です。また、リテラル文字列の比較が正規表現のマッチングよりも高速であるため、マッチングも高速化されます。
  • この-wフラグを使用すると、部分的に一致する項目は結果に入力されません。たとえば、最初の列に複数の数字を含めることができるgrep場合は、最初の実行に特に望ましいです。file1.txt12

修正する

@Stéphane Chazelasが指摘したように、このオプションはプログラムを参照する-fために(常にではありませんが)実装された値を受け入れるため、次のように書くこともできます。-stdin

grep -w 2 file1.txt | grep -F -w -f - file2.txt

他のコマンドの出力を読み取るには、より簡単に識別できるパイプ方法を使用してください。


ノート

  1. これは、パターンがnumber colorの最初の2つの列としてのみ表示されると仮定しますfile2.txt。後で同じラインで起こるかもしれないなら

    4 red square and 2 blue triangle
    

    これらの行は一致していると誤って識別されます。

  2. 表形式のデータで作業している場合(ここでそうです)、awk通常このツールはより適切なツールです。あなたの仕事は次の手順で行うことができますawk

    awk -v num="2" 'NR==FNR{if ($1==num){col[$2]}; next} ($1==num) && ($2 in col)' file1.txt file2.txt
    

    これにより、両方のファイルが処理されます。検索キーワードはawk変数で指定されますnum

    最初のファイルを処理するとき(NRグローバル行カウンターがFNRファイル別の行カウンターと同じ)、2番目の列に色を登録します。配列のインデックスから colcol[$2](したがって、最初の列の数字が一致した場合、実際には何も割り当てられません。)その後、次の実行行にジャンプします。

    2番目のファイルを処理するときは、最初の列が変数と一致し、2番目の列が配列のnumインデックスにあることを確認してくださいcol。その場合は、その行を印刷します。

おすすめ記事