如何刪除前幾行資料和特定的匹配數字直到資料的最後

如何刪除前幾行資料和特定的匹配數字直到資料的最後
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」的行不在固定位置。

相關內容