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