次のファイルが多い場合:
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
...
file1
1行に含まれるすべての行を取得する最良の方法は何ですか?両方 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を使用して合計を連結しますfile1
。file2
file1
file2
そしてすべてが再び合わされます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から返されたパターンを検索します。