So löschen Sie die ersten Datenzeilen und eine bestimmte übereinstimmende numerische Nummer bis zum Ende der Daten

So löschen Sie die ersten Datenzeilen und eine bestimmte übereinstimmende numerische Nummer bis zum Ende der Daten
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

perlhat 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 -pFlagge tun, um es in einen Einzeiler zu fassen:

perl -pe 'next unless $. > 5; last if /0 0/' your_file

Weil wir es verwenden, lastwird die Verarbeitung abgebrochen (und das Lesen der Datei beendet).

-pist eine perlOption, 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.

verwandte Informationen