【问题标题】:Combine matching lines using sed or awk?使用 sed 或 awk 组合匹配行?
【发布时间】:2010-01-20 23:27:48
【问题描述】:

我有一个类似如下的文件:

1,  
cake:01351  
12,  
bun:1063  
scone:13581  
biscuit:1931  
14,  
jelly:1385

我需要对其进行转换,以便当在一行的开头读取一个数字时,它将与它下面的行合并,但如果开头没有数字,则该行保持原样。这将是我需要的输出:

1,cake:01351  
12,bun:1063  
scone:13581  
biscuit:1931  
14,jelly:1385

用 sed 实现这一点有很多麻烦,似乎它可能不是我认为应该很简单的最佳方法。

非常感谢任何建议。

【问题讨论】:

    标签: linux shell sed awk


    【解决方案1】:

    另一个 awk 解决方案,比其他一些答案不那么神秘:

    awk '/^[0-9]/ {n = $0; getline; print n $0; next} 1'
    

    【讨论】:

      【解决方案2】:

      一个非常基本的sed 实现:

      sed -e '/^[0-9]/{N;s/\n//;}'
      

      这依赖于上的第一个字符,“数字”行是一个数字(如您指定的那样)。

      • 匹配以数字开头的行,^[0-9]
      • 进入下一行,N
      • 删除嵌入的换行符s/\n//

      【讨论】:

        【解决方案3】:

        这是我内部网上的一个文件。我不记得我在哪里找到了方便的sed 单线。如果您搜索“sed one-liner”,您可能会找到一些东西


        您是否曾经需要合并文本行,但手工操作太繁琐。

        例如,假设我们有一个包含数百行的文本文件,如下所示:

        14/04/2003,10:27:47,0
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.011,0.975,0.005
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.011,0.975,0.005
        14/04/2003,10:30:51,600
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.011,0.975,0.005
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.010,0.975,0.005
        14/04/2003,10:34:02,600
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.011,0.975,0.005
        IdVg,3.000,-1.000,0.050,0.006
        GmMax,0.010,0.975,0.005
        

        每个日期 (14/04/2003) 都是数据记录的开始,并在接下来的四行继续。

        我们希望将其作为“逗号分隔值”文件输入 Excel,并在自己的行中查看每条记录。

        在我们的例子中,我们需要将任何以 G 或 I 开头的行附加到前一行,并插入一个逗号,以便产生以下内容:

        14/04/2003,10:27:47,0,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.005,IdVg,3.000,...  
        14/04/2003,10:30:51,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,...
        14/04/2003,10:34:02,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,...
        

        这是“正则表达式”的经典应用,sed 再次发挥了作用。

        编辑可以用一个 sed 命令完成:

        sed -e :a -e '$!N;s/\n\([GI]\)/,\1/;ta' -e 'P;D' filename >newfilename
        

        我没说这很明显,或者很容易,不是吗?

        这是您在需要时在某处写下来以备不时之需的那种命令。

        【讨论】:

          【解决方案4】:

          试试正则表达式,比如:

          sed '/[0-9]\+,/{N}s/\n//)'
          

          检查第一行是否有数字 (0-9) 和逗号,然后将新行替换为空,将其删除。

          【讨论】:

          • 只检查一位数字。你需要[0-9]\+
          • 啊,没听懂。固定。
          【解决方案5】:
          $ awk 'ORS= /^[0-9]+,$/?" ":"\n"' file
          1, cake:01351
          12, bun:1063
          scone:13581
          biscuit:1931
          14, jelly:1385
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-10
            • 2016-08-15
            • 2023-02-02
            • 1970-01-01
            • 2013-07-28
            • 2012-08-01
            • 2022-10-04
            相关资源
            最近更新 更多