データの最初の数行と、データの最後まで一致する特定の数値を削除する方法

データの最初の数行と、データの最後まで一致する特定の数値を削除する方法
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  

2 つの正規表現、行番号、またはその組み合わせの間にあるかどうかをテストできます。

しかし、見てみると、おそらく次のようにする方が簡単かもしれません。

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

-p便利なことに、フラグを使用してこれを 1 行で実行できます。

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」を含む行が固定位置にない場合。

関連情報