删除以“0”结尾的行在以“0”结尾的行之后

时间:2016-02-12 17:16:45

标签: regex bash grep multiline

我正在寻找一种方法来从一个非常大的txt文件中删除bash多线模式。

我有这样的行:

    1;alias;1.872198312
    2;alias;0.
    3;alias;0.
    4;alias;2.982193126
    5;alias;1.987502017
    6;alias;0.
    7;alias;0.802829100
    8;alias;0.
    9;alias;0.
    10;alias;0.
    11;alias;0.
    12;alias;1.7210172

我想将此文件转换为:

    1;alias;1.872198312
    2;alias;0.
    4;alias;2.982193126
    5;alias;1.987502017
    6;alias;0.
    7;alias;0.802829100
    8;alias;0.
    12;alias;1.7210172

因此减小了文件的大小。

我尝试过grep方法:

    grep '0.$^[a-zA-Z0-9.;_]0.$' file.txt

没有成功。

3 个答案:

答案 0 :(得分:2)

您可以使用awk

来获取它
awk -F';' '{if ($NF == "0.") if (!z) z=1; else next; else z=0} 1' file

<强>输出:

1;alias;1.872198312
2;alias;0.
4;alias;2.982193126
5;alias;1.987502017
6;alias;0.
7;alias;0.802829100
8;alias;0.
12;alias;1.7210172

答案 1 :(得分:1)

使用sed:

$ sed '/0\.$/{:a;N;/0\.$/s/\n.*$//;ta}' infile
    1;alias;1.872198312
    2;alias;0.
    4;alias;2.982193126
    5;alias;1.987502017
    6;alias;0.
    7;alias;0.802829100
    8;alias;0.
    12;alias;1.7210172

评论:

/0\.$/ {              # If a line ends with '0.'
    :a                # Label to branch to
    N                 # Append next line to pattern space
    /0\.$/s/\n.*$//   # If that next line ends with '0.', remove it
    ta                # If we made a substitution, branch to label
}

要使用BSD sed的单线程,;之后必须有额外的ta

答案 2 :(得分:1)

Perl解决方案:

perl -ne 'print if ! ($skipnext = /;0\.$/) || ! $skip; $skip = $skipnext;' input
  • -n逐行读取输入。
  • /;0\.$/是正则表达式。它匹配分号,零,点,行尾。
  • !是否定的。