데이터의 처음 몇 행과 데이터가 끝날 때까지 특정 일치 숫자를 삭제하는 방법

데이터의 처음 몇 행과 데이터가 끝날 때까지 특정 일치 숫자를 삭제하는 방법
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"을 포함하는 행이 고정된 위치에 있지 않은 경우.

관련 정보