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”的行不在固定位置。