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つで始まるすべての行を見つけることができます。grep
file1.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.txt
12
修正する
@Stéphane Chazelasが指摘したように、このオプションはプログラムを参照する-f
ために(常にではありませんが)実装された値を受け入れるため、次のように書くこともできます。-
stdin
grep -w 2 file1.txt | grep -F -w -f - file2.txt
他のコマンドの出力を読み取るには、より簡単に識別できるパイプ方法を使用してください。
ノート
これは、パターンが
number color
の最初の2つの列としてのみ表示されると仮定しますfile2.txt
。後で同じラインで起こるかもしれないなら4 red square and 2 blue triangle
これらの行は一致していると誤って識別されます。
表形式のデータで作業している場合(ここでそうです)、
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番目の列に色を登録します。配列のインデックスからcol
col[$2]
(したがって、最初の列の数字が一致した場合、実際には何も割り当てられません。)その後、次の実行行にジャンプします。2番目のファイルを処理するときは、最初の列が変数と一致し、2番目の列が配列の
num
インデックスにあることを確認してくださいcol
。その場合は、その行を印刷します。
答え2
解決済み:
$ grep 2 file1.txt | xargs -I{} grep {} file2.txt
2 blue triangle
2 blue circle
2 orange circle