使用Sed或awk合并数据的格式

使用Sed或awk合并数据的格式,awk,sed,Awk,Sed,我有以下格式的数据 房间:L1, 名称:Test, 出生日期:2017年10月12日, 章节:ABC, 姓名:BTest2,, 状态:批准, 出生日期:2017年10月12日, 规则:向前, 注释:测试注释, 房间:L2, 名称:Test2, 出生日期:2017年10月11日, 规则:向后, 我试图得到以下格式的输出 会议室:L1,名称:试验,日期:2017-10-12,章节:ABC, 会议室:L1,名称:BTest2,状态:批准,日期:2017-10-12,规则:转发,评论:测试评论,

我有以下格式的数据

房间:L1,
名称:Test,
出生日期:2017年10月12日,
章节:ABC,
姓名:BTest2,,
状态:批准,
出生日期:2017年10月12日,
规则:向前,
注释:测试注释,
房间:L2,
名称:Test2,
出生日期:2017年10月11日,
规则:向后,

我试图得到以下格式的输出

会议室:L1,名称:试验,日期:2017-10-12,章节:ABC,
会议室:L1,名称:BTest2,状态:批准,日期:2017-10-12,规则:转发,评论:测试评论,
房间:L2,名称:Test2,日期:2017-10-11,规则:向后,

我尝试使用awk和sed格式化数据,但由于模式不太一致,我无法这样做。是否有任何方法仅基于名称的出现来执行此操作。在下面的示例中,我同时使用了名称和注释,因此失败了

awk'/^Room/{s=$0}/^Name/&match(p,/^Comment/){$0=sprintf(“%s%s%s”,s,ORS,$0)}{print;p=$0}'test.txt|sed':a/评论/!{N;s/\N//g;ba}'


非常感谢您的帮助。

Awk
解决方案:

awk '/^Room/{ if (R){ print ""; delete keys } R=$0; k=$3 }
     /^Name/{ keys[k $1]++ }
     { printf "%s%s", (keys[k $1] > 1? ORS R : ""), $0 }
     END{ print "" }' file
输出:

Room : L1,Name : Test,DOB : 2017-10-12,Section : ABC,
Room : L1,Name : BTest2,Status : APPROVE,DOB : 2017-10-12,Rule : forward,Comment : Testing comment,
Room : L2,Name : Test2,DOB : 2017-10-11,Rule : Backward,
输出:

Room : L1,Name : Test,DOB : 2017-10-12,Section : ABC, Room : L1,Name : BTest2,Status : APPROVE,DOB : 2017-10-12,Rule : forward,Comment : Testing comment, Room : L2,Name : Test2,DOB : 2017-10-11,Rule : Backward, 会议室:L1,名称:试验,日期:2017-10-12,章节:ABC, 会议室:L1,名称:BTest2,状态:批准,日期:2017-10-12,规则:转发,评论:测试评论, 房间:L2,名称:Test2,日期:2017-10-11,规则:向后, 这可能适用于您(GNU-sed):


这会将
房间
之间的行聚集到一行中,然后在有多个
名称
字段的
房间
字段中插入一个换行符。

一组较小的示例数据可能会简化您的问题描述。你想把所有的“字段”都放到一行吗?请更新你的Q以便你的需求更清楚。祝你好运。我并没有试图在一行中合并所有字段。但合并室和所有记录之间的两个发生的名称。这是最小的数据集。@ USER 254333,但是<代码> DOB密钥也出现在代码< >房间:L1 < /代码>两次-考虑更新您的output@RomanPerekhrest .. 我会觉得名称是关键,因为名称出现在新集合开始的第一个字符串中,需要和最后一个字符串合并Room@user2854333,详细说明您的逻辑:是否应仅将
名称
键视为分离的原因? Room : L1,Name : Test,DOB : 2017-10-12,Section : ABC, Room : L1,Name : BTest2,Status : APPROVE,DOB : 2017-10-12,Rule : forward,Comment : Testing comment, Room : L2,Name : Test2,DOB : 2017-10-11,Rule : Backward,
sed -r '/^Room/{:a;N;s/^((.*, )(Name).*\n)\3/\1\2\3/;tb;/\nRoom/!s/\n/ /;ta;:b;P;D}' file