
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
perl
tiene 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 -p
bandera, 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, last
se cancela el procesamiento (y se deja de leer el archivo).
-p
es una perl
opció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.