テンプレートを介して2つのファイル履歴をマージします。

テンプレートを介して2つのファイル履歴をマージします。

私はawkを使ってやや具体的な方法で2つのテキストファイルをマージしようとしています。 file1 から 2 行を取り、file2 から単語セット (ただし別の行にある) を無限に交互に使用します。 file2 の単語グループはコンマで区切られます。たとえば、
ファイル1

A Partridge in a Pear Tree
Two Turtle Doves
Three French Hens
Four Calling Birds
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming

ファイル2

I was born, the red planet, I am hungry, on Mars
I love frogs, they are so tasty, with gold sun, red ketchup

結果ファイル

A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet 
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming

詳細:

  • 出力ファイルでは、file1の2行ごとにFile2フィールドに4行の追加行が作成されます。
  • file1 は、内容に関係なく、2 行のカプラーに分割されます。
  • file2の1行には4つのグループ(3つのカンマなど)があります。
  • 出力ファイルにカンマがありません
  • file2のグループには固定数のフィールドがあります。
  • file1 と file2 は任意に長くできます。
  • file2 は常に file1 より小さい。
  • カンマ区切りのFile2フィールドは、常に各レコードに同じ順序(3、3、3、2)で表示されます。つまり、$1 $2 $3、$4 $5 $6、$7 $8 $9、$10 S11

    出力ファイルで、次のようにソートします。

梨の木に眠る

山鳩2匹

$1 $2 $3

$4 $5 $6

$7 $8 $9

$10S11

フランスの鶏3匹

4匹のおむつは鳥です

私はカエルが大好き

彼らはおいしいです

黄金色の太陽と

赤いトマトソース

五つの金輪

ガチョウ6匹が卵を産む

七匹の白鳥が泳いでいる

8人のメイド搾乳

踊る9人の女性

テンロードジャンプ

イレブンパイパースパイプ

12人のドラマーが北を打っている

  • あるファイルの終わりに達したが他のファイルにまだデータがある場合は、目的の動作が指定されていません。残りのデータ(file1の)は変更されずに印刷されます。

どうすればいいですか?

答え1

file1あなたの例では、5行目が早すぎると思います。

私の言葉が正しい場合は、次のスニペットを試してください。

awk '(NR+1)%2{print $0;getline<"file2";n=split($0,a,", ");if(n>1)for(i in a)print a[i];next}1' file1

出力:

A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming

答え2

上記の意見に加えて(希望する場合)アッスクリプト

awk -F', ' '1;!(NR%2)&&(getline <"file2")>0{$1=$1;print}' OFS='\n' file1

どこ

  • 1- 同義語{print $0}:
    • 状況= true1)、
    • 行動指定しない場合 = default( print),
    • 印刷パラメータなし=print $0
  • !(NR%2)- 偶数行の場合:
    • NR-窒素数量彩(記録)
    • %- 2で割った残りを計算し、
    • !- 結果反転
  • &&- 論理AND
  • getline <"file2"$0- で行を読むファイル2そしてそれをフィールドに分けてください。F生産するS区切り文字はオプションとして表示され、成功すると返され-F=', 'ます。1
  • $1=$1- サポートコツ酸素出力F生産するSeperator: フィールドについて何かをする必要があります。それ以外の場合は$0そのまま印刷されます。

関連情報