【问题标题】:Join multiple rows with specific delimiter to one row将具有特定分隔符的多行连接到一行
【发布时间】:2015-04-10 06:13:53
【问题描述】:

我想在这种情况下连接多行,在分隔符之后总是有 4 行,但这并不意味着将来其中一个可以包含更多的 4 行。无论如何,我想在使用分隔符 -- 时将它们加入一行并将他排除在最终视图示例之外:

--
        CATALOG
        DB1
        1
         good
--
        USERS
        DB2
        3
         good

我用trawk 尝试了几件事,但没有成功。

我想要做的最终视图是:

CATALOG DB1 1 good
USERS DB2 3 good

【问题讨论】:

    标签: perl shell awk sed tr


    【解决方案1】:

    我会将记录分隔符设置为--,然后遍历字段:

    awk -v RS="--" 'NF{for (i=1;i<=NF;i++) printf ("%s%s", $i, (i==NF?"\n":FS) )}' file
    

    说明

    • -v RS="--" 将记录分隔符设置为 -- 而不是默认的新行
    • NF{} 每当记录中有字段时,执行括号内的操作。
    • for (i=1;i&lt;=NF;i++) printf ("%s%s", $i, (i==NF?"\n":FS) ) 循环打印所有字段。它们之间的分隔符总是FS(它的默认值是一个空格)和一个新行,如果我们正在处理最后一个。

    测试

    有多余的行。

    $ cat a
    --
            CATALOG
            DB1
            1
             good
    --
            USERS
            DB2
            3
             good
        bad
    $ awk -v RS="--" 'NF{for (i=1;i<=NF;i++) printf ("%s%s", $i, (i==NF?"\n":FS) )}' a
    CATALOG DB1 1 good
    USERS DB2 3 good bad
    

    【讨论】:

    • 您需要gnu awk,因为记录选择器中有多个字符。
    【解决方案2】:
    sed '#n
    /^--$/ b print
    H;$!b
    :print
    s/.*//;x;s/^[[:cntrl:][:space:]]*//;s/[[:cntrl:][:space:]]\{1,\}/ /gp' YourFile
    
    • 删除以 -- 开头的行,如果出现则打印缓冲区内容(最后一节)
    • 载入缓冲电流线
    • 如果不是文件周期结束
    • 通过删除空格和新行重新格式化后打印内容(所以结束或新部分)

    【讨论】:

      【解决方案3】:

      这是一个简单的gnu awk(gnu 由于 RS 中有多个字符)。

      awk -v RS="--" '{$1=$1}NR>1' file
      CATALOG DB1 1 good
      USERS DB2 3 good
      

      $1=$1 这将使用新的记录选择器重新创建文件,并使用默认字段空间。
      NR&gt;1 然后打印除第一行(空白)之外的所有行。

      【讨论】:

        猜你喜欢
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 2017-08-14
        • 1970-01-01
        • 2018-09-22
        相关资源
        最近更新 更多