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