【问题标题】:Format to merge Data using Sed or awk使用 Sed 或 awk 合并数据的格式
【发布时间】:2018-02-02 18:18:27
【问题描述】:

我有以下格式的数据 Room : L1, Name : Test, DOB : 2017-10-12, Section : ABC, 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,

我尝试使用 awk 和 sed 来格式化数据,但由于模式不是很一致,我无法这样做。无论如何,是否仅基于 Name 的出现来做到这一点。在下面的示例中,我同时使用了 Name 和 Comment,因此它失败了。

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

非常感谢您的帮助。

【问题讨论】:

  • 一组较小的样本数据可能会简化您的问题描述。您是否试图将所有“字段”放在一条线上?请更新您的 Q,以便您的需求更清晰。祝你好运。
  • 嗨。我不想将所有字段合并到一行中。但是将 Room 与两次出现 Name 之间的所有记录合并。这是我能做的最小的数据集。
  • @user2854333,但 DOB 键在 Room: L1 中也出现了两次 - 考虑更新您的输出
  • @user2854333,详细说明你的逻辑:应该只将Name 键视为分离的原因吗?

标签: awk sed


【解决方案1】:

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,

【讨论】:

    【解决方案2】:
    awk '/^Room/          {room=$0;                  next}
         NR==2 && /^Name/ {printf("%s%s",room,$0);   next}
         NR>2  && /^Name/ {printf("\n%s%s",room,$0); next}
         {printf("%s",$0)}
         END{print ""}' file
    

    输出:

    房间:L1,名称:Test,出生日期:2017-10-12,部分:ABC, 房间:L1,名称:BTest2,状态:批准,出生日期:2017-10-12,规则:转发,评论:测试评论, Room : L2,Name : Test2, DOB : 2017-10-11, Rule : Backward,

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -r '/^Room/{:a;N;s/^((.*, )(Name).*\n)\3/\1\2\3/;tb;/\nRoom/!s/\n/ /;ta;:b;P;D}' file
      

      这会将Room 之间的行收集到一行中,然后插入一个换行符和Room 字段,其中有多个Name 字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 2013-08-29
        • 1970-01-01
        • 2016-08-15
        • 2017-04-18
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多