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