我试图使用 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"
- 将行读入$0
from文件2并将其划分为字段F产量Separator 指示为选项,如果成功则-F=', '
返回。1
$1=$1
- 应用技巧氧输出F产量Separator:我们必须对字段做一些事情,否则将按$0
原样打印