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

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
18.02.2016, 23:55
3 ответа

У вас ПОЧТИ верно ...

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 обратно, если это то, что вам нужно

0
28.01.2020, 05:13

В 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 - он преобразует строку и затем печатает строку.

0
28.01.2020, 05:13
sed -i -e '1,5d' -e '/0 0/,$d

, если строка, содержащая «0 0», находится не в фиксированном месте.

0
28.01.2020, 05:13

Теги

Похожие вопросы