【问题标题】:How to merge unknown number of multiple lines between two patterns into a single line using awk如何使用awk将两个模式之间的未知数量的多行合并为一行
【发布时间】:2014-01-13 19:15:22
【问题描述】:

我有一些文本文件,其中每个文件都有如下信息

235.91 245.67 B: some information here
246.79 246.99 A: some other information here,
more information here,
and may be here
247.45 248.99 A: some other text here,
some more here
249.98 ---- 

模式重复

我希望文字按如下排列:

235.91 245.67 B: some information here
246.79 246.99 A: some other information here, more information here, and may be here
247.45 248.99 A: some other text here. some more here
249.98 -----

这意味着我想合并两个匹配模式之间的所有行(它们之间有空格)

我希望每一行都以数字作为模式开始。数字总是有一个小数点,小数点后有两位数。一个模式和下一个模式之间的行数会有所不同(可能有一条或多条线,也可能根本没有线)。

有人可以帮助我使用 shell 脚本,最好是使用 awk 吗?

【问题讨论】:

    标签: shell awk grep


    【解决方案1】:

    听起来你需要这样的东西:

    awk '
    { printf "%s%s", ($1 ~ /\.[[:digit:]][[:digit:]]/ ? rs : FS), $0; rs=RS }
    END { print "" }
    ' file
    

    【讨论】:

    • 我也有同样的问题。如果我们有这个 2016-03-19 而不是“235.91 245.67 B”,并且在每一行的文件中都相同。模式是什么?请帮忙
    【解决方案2】:

    @EdMorton 的回答更妙,但这也有效。

    $1 ~ /^[[:digit:]]+\.[[:digit:]][[:digit:]]$/ { if (NR-1) {print ""} printf "%s", $0; next }
    {printf " %s", $0}
    END { print ""}
    

    【讨论】:

      【解决方案3】:

      我不知道 awk,但 sed 也可以:

      grep -v '^$' | sed ':a;N;$!ba;s/\n\([^0-9]\)/ \1/g'
      

      sed 之前的可怕事情的解释在这里: How can I replace a newline (\n) using sed?

      【讨论】:

        猜你喜欢
        • 2016-07-06
        • 2020-03-02
        • 1970-01-01
        • 2020-11-02
        • 2012-04-30
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多