通过模板合并2个文件记录

通过模板合并2个文件记录

我试图使用 awk 以一种相当特殊的方式合并两个文本文件,从 file1 中取出两行,从 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

细节:

  • 在输出文件中,每 2 行 file1 从字段 File2 创建 4 个附加行
  • file1 被分成两行对联,无论内容如何
  • file2 中的一行有 4 个组(即 3 个逗号)
  • 输出文件中没有逗号
  • file2 中的一个组有固定数量的字段
  • file1 和 file2 可以是任意长
  • file2 总是小于 file1
  • 以逗号分隔的 File2 字段在每条记录中始终以相同的顺序出现 (3,3,3,2),即 $1 $2 $3, $4 $5 $6, $7 $8 $9, $10 S11

    在输出文件中要这样安排

梨树上的鹧鸪

两只斑鸠

$1 $2 $3

$4 $5 $6

$7 $8 $9

10 美元 S11

三只法国母鸡

四只鸣叫鸟

我爱青蛙

它们很好吃

与金色的太阳

红番茄酱

五枚金戒指

六只鹅产蛋

七只天鹅a-游泳

八个女仆挤奶

九位女士跳舞

十领主跳跃

十一个风笛手管道

十二鼓手击鼓

  • 当您到达一个文件的末尾但另一个文件中仍有数据时所需的行为未指定 - 剩余数据(来自 file1)将不加更改地打印

我该怎么做呢?

答案1

file1我相信您在示例中太早地放置了第五行。

如果我是对的,请尝试这个片段:

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脚本

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

在哪里

  • 1- 同义词{print $0}
    • 状况= true( 1),
    • 行动如果不注明= default( print),
    • 打印不带参数=print $0
  • !(NR%2)- 对于偶数行:
    • NR-数量ow(记录)
    • %- 计算除以 2 后的余数,
    • !- 反转结果
  • &&- 逻辑性AND
  • getline <"file2"- 将行读入$0from文件2并将其划分为字段F产量Separator 指示为选项,如果成功则-F=', '返回。1
  • $1=$1- 应用技巧输出F产量Separator:我们必须对字段做一些事情,否则将按$0原样打印

相关内容