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"을 포함하는 행이 고정된 위치에 있지 않은 경우.