【问题标题】:Merge the next line if the current line contains a pattern at the end如果当前行末尾包含模式,则合并下一行
【发布时间】:2017-08-02 19:30:58
【问题描述】:

我有一个非常大的文本文件。如果当前行最后有一个单词 OR,我想将下一行合并到当前行。 例如。就像在下面的行中

somerandomstring OR
someotherrandomstring

上面两行应该变成

somerandomstring OR someotherrandomstring

只有那些行应该改变。其余行必须保持原样。提前致谢。

请允许我进一步扩展这个问题。 我也想看看下一行是不是以OR开头,而OR不在当前行的末尾,那上面的case和这个case怎么一起实现呢?

【问题讨论】:

    标签: awk sed tr


    【解决方案1】:

    使用 GNU sed:

    sed '/ OR$/{N;s/\n/ /}' file
    

    在行尾搜索空格后跟OR ($),如果找到,则将下一行 (N) 读取到模式空间并将模式空间中的换行符 (s///) 替换为一个白色空间。

    如果您想“就地”编辑文件,请使用 sed 的选项 -i。

    【讨论】:

      【解决方案2】:

      您可以在awk 中执行此操作,方法是将“OR”行分配给变量并在未找到“OR”时打印存储在变量中的任何内容。

      awk '$NF=="OR"{buffer=buffer$0" "} $NF!="OR"{print buffer$0;buffer=""}' test.txt
      

      这也适用于可能具有“OR”的多行,方法是将行连接到 buffer 变量,直到找到非 OR 行,打印它并清除 buffer 变量。


      awk 中的另一个选项是在 OR 行上使用 printf,在非或行上使用 print(这有点类似于 @cyrus 的 GNU sed 示例,但在 awk 中)

      awk '$NF=="OR"{printf "%s ", $0} $NF!="OR"{print $0}' test.txt
      

      这是同一只野兽,但在printf 中使用了三元运算符:

      awk '{printf $NF=="OR"?"%s ":"%s\n", $0}' test.txt
      

      【讨论】:

      • 是的,它正在工作。谢谢。你能告诉我下一行是否也以 OR 开头(不是最后一行),那么我怎样才能做到这一点。我想同时考虑这两种情况。
      • 那会是这样的:“Line 1 OR/Line 2/OR Line3”,而您想要输出“Line 1 OR Line 2 OR Line 3”?
      • 啊.. 实际上没有要求“第 1 行 OR/Line2/OR 第 3 行”必须按此顺序排列。 OR 在行尾或行首的出现是完全随机的。
      【解决方案3】:

      另一个awk

      $2$ awk -v RS='^$' -v k='OR' '{gsub(k ORS,k FS); gsub(ORS k,FS k); printf "%s",$0}' file
      
      x OR y
      x OR y
      

      用于测试输入文件

      $ cat file
      
      x OR
      y
      x
      OR y
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2012-01-12
        • 2020-05-26
        • 2015-10-29
        相关资源
        最近更新 更多