如果当前行在末尾包含模式,则合并下一行

时间:2017-08-02 19:30:58

标签: awk sed tr

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

somerandomstring OR
someotherrandomstring

以上两行应该成为

somerandomstring OR someotherrandomstring

只有这些线条才能改变。其余的线条必须保持原样。提前谢谢。

请允许我进一步扩展这个问题。 我还想看看下一行是否以OR开头并且OR不在当前行的末尾,那么如何实现上述情况和这种情况一起?

3 个答案:

答案 0 :(得分:1)

使用GNU sed:

public function getSpieler()
{
    $spielID = Input::get('spielID');
    $spielerOutput = Spieler::where('spielPlanID', '=', $spielID)->get();
    return Response::json($spielerOutput);
}

在行尾(sed '/ OR$/{N;s/\n/ /}' file )搜索空格后跟OR,如果找到,则读取下一行($)以模式空间并替换模式空间中的换行符(使用{ {1}})一个空格。

如果你想编辑你的文件"就地"使用sed的选项N

答案 1 :(得分:0)

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

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

这也适用于多行,通过将行连接到buffer变量可能具有“OR”,直到找到非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

答案 2 :(得分:0)

另一个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