我正在寻找一种方法来从一个非常大的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
没有成功。
答案 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\.$/
是正则表达式。它匹配分号,零,点,行尾。!
是否定的。