他のファイルでパターンを一致させる前に、ファイルから行を読み込んで結合する方法は?

他のファイルでパターンを一致させる前に、ファイルから行を読み込んで結合する方法は?

このヒントは役に立ちますが、まだ少し迷っています。私はその非常に単純な形式を盗みます。 別のファイルのパターン(タグ)の前にあるファイルの内容を挿入するには?

2つのファイルがあります。

ファイル1

test
test2
test3
test4

ファイル2

Numebr of results: 0
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
Numebr of results: 0
Numebr of results: 0

希望の最終結果(ファイル3?)

test
Numebr of results: 0
test2
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

file1 から一度に 1 行ずつ読み込み、「結果数」の次のパターンを探し、最初の一致項目の上の file1 に line1 を挿入し、ファイル全体を順番に繰り返そうとします。

よろしくお願いします!

答え1

使用することをお勧めします行/変数/ファイルのインポートawk getline

$ awk '/^Numebr of results/ {if (getline line < "file1" > 0) print line} 1' file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
last_element: false
referral_info: source
referral_obj: Name: ommitted (Table: ommitted)
scheme_flags: 0
type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

答え2

$ awk 'NR==FNR{A[NR]=$0;next}{if($0~/^Numebr of results/){i++;print A[i]}}1' file1 file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

答え3

で行うことができますが、より適切になりますsedawk

エコ"--" | catファイル1 - ファイル2 | sed -n '1,/----/{H;d} /Numebr/ {x;s/^\n//;P;s /[^\n]*\n//;x;};

答え4

私は単にファイル記述子を管理するためにサブシェルを使用します。 (「exec 3>&-」は不要)
サブプロセスに継承されたファイル記述子
これらのファイル記述子を使用すると、各読み取り操作は以下のファイルの場所を移動します。
「e」オプションは、パターン空間文字列をshのコマンドとして実行します。

sh$ ( exec 3< file2; 

  sed -r '
    /^Number of results: [0-9]+/ {
    h
    s#.*#read line <\&3; echo -n "$line"#e
    G
    }
  ' file1; 
)

関連情報