
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
Die resultierende Ausgabe sollte wie folgt aussehen
3, 2 Rs12345
0.7 0.2
3, 2 Rs31256
0.56 0.311
3, 2 Rs25691
Ich habe den sed verwendet, um das gewünschte Ergebnis zu erzielen
sed -i -e '1,5d;/0 0/,$d' filename
Das hat nicht funktioniert. Ich arbeite mit mehreren Dateien wie dieser, die unterschiedliche Zeilenlängen haben. Daher muss ich die „0 0“ und jede Zeile danach (ganz am Ende der Daten) irgendwie loswerden.
Antwort1
Sie hatten FAST recht ...
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
Fügen Sie einfach -i wieder hinzu, wenn Sie das möchten.
Antwort2
perl
hat eine nette Funktion, den sogenannten Bereichsoperator. Damit können Sie etwa Folgendes tun:
#!/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
Sie können testen, ob der Ausdruck zwischen zwei regulären Ausdrücken, Zeilennummern oder einer Mischung liegt.
Obwohl es auf den ersten Blick vielleicht einfacher ist, einfach Folgendes zu sagen:
while ( <DATA> ) {
next unless $. > 5;
last if /0 0/;
print;
}
Praktischerweise können Sie dies mit der -p
Flagge tun, um es in einen Einzeiler zu fassen:
perl -pe 'next unless $. > 5; last if /0 0/' your_file
Weil wir es verwenden, last
wird die Verarbeitung abgebrochen (und das Lesen der Datei beendet).
-p
ist eine perl
Option, die ein ähnliches Verhalten bewirkt sed
: Es transformiert eine Zeile und druckt die Zeile anschließend.
Antwort3
sed -i -e '1,5d' -e '/0 0/,$d
wenn die Zeile mit „0 0“ nicht an einer festen Stelle steht.