将具有特定分隔符的多行连接到一行

时间:2015-02-10 09:13:42

标签: perl shell awk sed tr

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

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

我在tr awk尝试了几件事但没有成功。

我想做的最终观点是:

CATALOG DB1 1 good
USERS DB2 3 good

3 个答案:

答案 0 :(得分:2)

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

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<=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

答案 1 :(得分:1)

sed '#n
/^--$/ b print
H;$!b
:print
s/.*//;x;s/^[[:cntrl:][:space:]]*//;s/[[:cntrl:][:space:]]\{1,\}/ /gp' YourFile
  • 删除以 - 开头的行,如果发生则打印缓冲区内容(最后一节)
  • 加载缓冲区当前行
  • 如果没有文件结束周期
  • 通过删除空格和新行重新格式化后打印内容(结束或新节)

答案 2 :(得分:1)

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

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

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