如何删除前几行数据和特定的匹配数字直到数据的最后

如何删除前几行数据和特定的匹配数字直到数据的最后
51 0 0 5  
0 0.0 0.0 0  
1 2 3 4 5 6 7 8  
1, 2  
0.998 0.567  
3, 2 Rs12345  
0.7 0.2  
3, 2 Rs31256  
0.56 0.311  
3, 2 Rs25691  
0 0  
012.1313010310 0.1213212 0.2121331321
0.0121654564 0.254564564 0.25678646 
0.02154 0.2485674354 0.2434  

结果输出应该是这样的

3, 2 Rs12345    
0.7 0.2  
3, 2 Rs31256  
0.56 0.311  
3, 2 Rs25691

我使用 sed 达到了预期的结果

sed -i -e '1,5d;/0 0/,$d' filename

这不起作用。我正在处理这样的多个文件,它们的行数长度不同。因此,我将不得不以某种方式摆脱“0 0”和之后的每一行(数据的最后)

答案1

你几乎是对的......

sed -e '1,5d;/^0 0/,$d' genetics 
3, 2 Rs12345  
0.7 0.2  
3, 2 Rs31256  
0.56 0.311  
3, 2 Rs25691

如果这是你想要的,只需添加 -i 即可

答案2

perl有一个很好的功能,称为范围运算符。它可以让你做这样的事情:

#!/usr/bin/env perl

use strict;
use warnings;

while ( <DATA> ) { 
    print if 6 ... /0 0/;
}

__DATA__
51 0 0 5  
0 0.0 0.0 0  
1 2 3 4 5 6 7 8  
1, 2  
0.998 0.567  
3, 2 Rs12345  
0.7 0.2  
3, 2 Rs31256  
0.56 0.311  
3, 2 Rs25691  
0 0  
012.1313010310 0.1213212 0.2121331321
0.0121654564 0.254564564 0.25678646 
0.02154 0.2485674354 0.2434  

您可以测试是否介于两个正则表达式、行号或混合之间。

不过,看看它,也许更简单的是:

while ( <DATA> ) { 
    next unless $. > 5; 
    last if /0 0/;
    print;
}

方便地 - 你可以用旗帜来做到这一点-p,使其成为单行:

perl -pe 'next unless $. > 5; last if /0 0/' your_file

因为我们使用last它会中止处理(并停止读取文件)。

-p是一个perl选项,使其行为有点像sed- 它转换一行,然后打印该行。

答案3

sed -i -e '1,5d' -e '/0 0/,$d

如果包含“0 0”的行不在固定位置。

相关内容