【问题标题】:use sed to merge lines and add comma使用 sed 合并行并添加逗号
【发布时间】:2014-06-25 12:44:42
【问题描述】:

我发现了几个相关的问题,但没有一个符合我的需要,而且由于我是一个真正的初学者,所以我无法弄清楚。

我有一个包含这样条目的文本文件,以空行分隔:

example entry &with/ special characters
next line (any characters)

next %*entry
more words

我希望输出合并行,在其间加逗号,然后删除空行。即,示例应如下所示:

example entry &with/ special characters, next line (any characters)
next %*entry, more words

我更喜欢 sed,因为我对它有点了解,但我也对 linux 命令行上的任何其他解决方案感到高兴。

【问题讨论】:

  • 数据中的逗号是否应该在输出中以某种方式消除歧义?
  • 那么空行是条目分隔符,还是你总是有两行应该连接在一起?

标签: bash sed


【解决方案1】:

根据 Kent 的优雅建议进行了改进:

awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file

它允许每个块有任意数量的线,而不是我每个块的 2 条刚性线。谢谢你,肯特。 注意7 是 Kent 的商标...任何非零表达式都会导致 awk 打印整条记录,并且他喜欢 7

您可以使用awk

awk 'BEGIN{RS="";FS="\n";OFS=","}{print $1,$2}' file

这会将记录分隔符设置为空行,将字段分隔符设置为换行符,将输出字段分隔符设置为逗号。

输出:

example entry &with/ special characters,next line (any characters)
next %*entry,more words

【讨论】:

  • +1 但是在BEGIN 块之后,对于“块”中有两行以上的情况,我会使用... '{$1=$1}7' file
  • op 在逗号后面想要space
  • 你的代码应该是awk 'BEGIN{RS="";FS="\n";OFS=", "}{print $1,$2}'
【解决方案2】:
sed -n '1h;1!H
$ {x
   s/\([^[:cntrl:]]\)\n\([^[:cntrl:]]\)/\1, \2/g
   s/\(\n\)\n\{1,\}/\1/g
   p
   }' YourFile

在缓冲区中加载文件后更改所有内容。可以在读取文件时“即时”完成并基于空行。

在 GNU sed 上使用 -e

【讨论】:

    【解决方案3】:

    简单的sed 命令,

    sed ':a;N;$!ba;s/\n/, /g;s/, , /\n/g' file
    
    • :a;N;$!ba;s/\n/, /g -> 根据this的回答,这段代码将所有新行替换为,(逗号和空格)。

    • 所以只运行第一个命令后,输出将是

      example entry &with/ special characters, next line (any characters), , next %*entry, more words
      
    • s/, , /\n/g -> 将上述输出中的, , 替换为新行会得到想要的结果。

      example entry &with/ special characters, next line (any characters)
      next %*entry, more words
      

    【讨论】:

    • 你必须处理文本中有, , 或一行末尾有, 的情况。如果没有发生,您的代码又快又简单
    【解决方案4】:

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

    sed ':a;$!N;/.\n./s/\n/, /;ta;/^[^\n]/P;D' file
    

    将下一行添加到当前行,如果换行符的任一侧有字符,则用逗号和空格替换换行符,然后重复。最终会到达一个空行或文件末尾,如果下一行不为空,则只打印下一行。

    另一个更复杂的版本(允许在空行中使用空格)是:

    sed ':a;$!N;/^\s*$/M!s/\n/, /;ta;/\`\s*$/M!P;D' file
    

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2013-05-19
      • 2011-06-19
      相关资源
      最近更新 更多