入力ファイル内の指定された行を含む(複数の)ファイル内の行を検索する

入力ファイル内の指定された行を含む(複数の)ファイル内の行を検索する

次のファイルが多い場合:

file1:

123
456
789
012

file2:

line1  922
line2  392
line3  456
line5  291
line6  201
...

file3:

line1  111
line2  123
line3  19
line5  542
line6  456
...

file11行に含まれるすべての行を取得する最良の方法は何ですか?両方 file2そしてfile3

この例では、次のようになります。

456

答え1

grep -of file1 file2|xargs -I {} grep -o "{}" file3

まず、file1の入力を受け取り、file2に1行ずつ入力して、正確に一致するテキスト(存在する場合)を返します。その後、結果がある場合は、ファイル3に1行ずつ供給され、一致するテキストのみを返します。

答え2

join連続して2回使用できます。

join -1 1 -2 2 -o 1.1 <(join -1 1 -2 2 <(sort file1) <(sort -k2 file2)) <(sort -k2 file3)

印刷専用:

465

まず、内部を見てくださいjoin。のフィールド1とフィールド2を使用して合計を連結しますfile1file2file1file2

そしてすべてが再び合わされますfile3。ファイルはsort -k結合フィールド()に基づいてソートする必要があります。

答え3

also(){
    sed 'h;                    #save a copy of the line before edits
         s/[]$\./*^[]/\\&/g;   #literally quote any metachars
         s|.*|/&/c\\|p;        #print first half of sed command
         g;                    #get original copy out of hold space
         s/\\/&&/g;' |         #double-up backslashes
    sed  -nf - -- "$@"         #read stdin script -file
}

この関数はパターンファイルを標準入力として使用し、1つ以上の検索ファイルを引数として使用します。検索ファイルに一致するパターンファイルのすべての行を出力に書き込みます。毎回オリジナルを正確に再現するために細心の注意を払います。そのため、再帰的に使用できます。

also <file1 file2 | also file3

456

答え4

grepは解決策に十分です

 grep -o "`grep -of file1 file2`" file3

内部的に、grep " grep -f file1 file2"はfile1とfile2のパターンをgrepし、file3から返されたパターンを検索します。

関連情報