Как удалить первые несколько строк данных и определенное совпадающее числовое значение до самого конца данных

Как удалить первые несколько строк данных и определенное совпадающее числовое значение до самого конца данных
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  

Вы можете проверить, находится ли он между двумя регулярными выражениями, номерами строк или их смесью.

Хотя, если посмотреть повнимательнее, возможно, проще просто:

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

Удобно - можно сделать это с флагом -p, чтобы сделать это одной строкой:

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», не находится в фиксированном месте.

Связанный контент