Cómo eliminar las primeras líneas de datos y un número numérico coincidente específico hasta el final de los datos

Cómo eliminar las primeras líneas de datos y un número numérico coincidente específico hasta el final de los datos
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  

La salida resultante debería verse así

3, 2 Rs12345    
0.7 0.2  
3, 2 Rs31256  
0.56 0.311  
3, 2 Rs25691

Usé el sed para lograr el resultado deseado.

sed -i -e '1,5d;/0 0/,$d' filename

Esto no funcionó. Estoy tratando con varios archivos como este que tienen diferentes longitudes en el número de líneas. Por lo tanto, tendré que deshacerme de alguna manera del "0 0" y de cada línea posterior (al final de los datos)

Respuesta1

Lo tenías CASI bien...

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

Simplemente agregue -i nuevamente si esto es lo que desea

Respuesta2

perltiene una característica interesante, llamada operador de rango. Te permite hacer algo como esto:

#!/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  

Puede probar si se encuentra entre dos expresiones regulares, números de línea o una combinación.

Aunque, mirándolo, quizás sea más sencillo simplemente:

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

Convenientemente, puedes hacer esto con la -pbandera, para que sea de una sola línea:

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

Debido a que lo estamos usando, lastse cancela el procesamiento (y se deja de leer el archivo).

-pes una perlopción que hace que se comporte un poco así sed: transforma una línea y luego la imprime.

Respuesta3

sed -i -e '1,5d' -e '/0 0/,$d

si la línea que contiene "0 0" no está en una ubicación fija.

información relacionada