【问题标题】:Using sed/awk to append one line to another使用 sed/awk 将一行附加到另一行
【发布时间】:2018-07-05 02:48:58
【问题描述】:

为了简化我想要的,我有这个:

Group name="Group1"
Device name="G1_Device1" host="G1_host1"
Device name="G2_Device2" host="G1_host2"
Group name="Group2"
Device name="G2_Device1" host="G2_host1"
Group name="Group3"
Device name="G3_Device1" host="G3_Host1"
Device name="G3_Device2" host="G3_host2"
Device name="G3_Device3" host="G3_host3"
Device name="G3_Device4" host="G3_host4"

我需要这个(检查组名):

Group name="Group1" Device name="G1_Device1" host="G1_host1"
Group name="Group1" Device name="G2_Device2" host="G1_host2"
Group name="Group2" Device name="G2_Device1" host="G2_host1"
Group name="Group3" Device name="G3_Device1" host="G3_Host1"
Group name="Group3" Device name="G3_Device2" host="G3_host2"
Group name="Group3" Device name="G3_Device3" host="G3_host3"
Group name="Group3" Device name="G3_Device4" host="G3_host4"

有没有办法用 sed 和/或 awk 做到这一点?

【问题讨论】:

  • 欢迎来到 StackOverflow!请添加您解决此问题的尝试。根据您包含的标签,我希望在您的问题中看到一些 bash、awk 和 sed 中的代码。您可以edit your question添加缺失的部分。
  • 对不起,但我不明白为什么实验的人在没有研究/努力解决问题的情况下回答问题。有时,他们会为基本的 sed 或 awk 投票支持三个或更多。很奇怪???
  • 请避免 "Give me the codez" 问题,这些问题已经被问了很多次并得到了回答,您必须努力避免找到答案。另见How much research effort is expected of Stack Overflow users?
  • 再次对所有帖子进行批量否决:(@Ed Morton

标签: linux bash awk sed


【解决方案1】:
awk '$1=="Group"{save=$0}; $1=="Device"{print save,$0}' file

输出:

组名="Group1" 设备名="G1_Device1" 主机="G1_host1" 组名="Group1" 设备名="G2_Device2" 主机="G1_host2" 组名="Group2" 设备名="G2_Device1" 主机="G2_host1" 组名称="Group3" 设备名称="G3_Device1" 主机="G3_Host1" 组名="Group3" 设备名="G3_Device2" 主机="G3_host2" 组名称="Group3" 设备名称="G3_Device3" 主机="G3_host3" 组名="Group3" 设备名="G3_Device4" 主机="G3_host4"

【讨论】:

    【解决方案2】:

    严格考虑到您的实际 Input_file 与显示的示例相同,那么以下可能会对您有所帮助。

    awk '/^Group name/{value=$0;next} {print value,$0}' Input_file
    

    所以在这里我没有检查一行是否有字符串device,如果您的 Input_file 在Group 之后可能有许多其他行,那么我们可能不得不像@Cyrus 的解决方案那样进行检查。

    【讨论】:

      【解决方案3】:

      使用 sed:

      sed -E '/^Group/{h;d};G;s/(.*)\n(.*)/\2 \1/' infile
      

      解释:

      /^Group/ {              # If the line starts with "Group"...
          h                   # copy pattern space to hold space
          d                   # Delete pattern space, start new cycle
      }
      G                       # Append hold space to pattern space (inserts newline)
      s/(.*)\n(.*)/\2 \1/     # Swap two lines in pattern space
      

      -E 选项(-r 用于一些较旧的 sed)只是为了方便;否则,捕获组需要转义,如\(.*\)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 2012-12-09
        相关资源
        最近更新 更多