sed 역참조 사용 시 문제

sed 역참조 사용 시 문제

일부 정크를 제거하고 단어를 다음 문자열로 시작하는 주요 번호로 바꾸려고 합니다.

>ref|NC_035781.1|  
>ref|NC_035782.1|   
>ref|NC_035783.1|   
>ref|NC_035784.1|   

다음으로 끝내고 싶습니다.

>NC_035781.1  
>NC_035782.1  
>NC_035783.1  
>NC_035784.1  

나는 노력했다

sed 's/\>ref\|NC_03578\([0-9]\)\.1\|/>NC_03578\1\.1/g' chr.test | grep '>NC_'

테스트한 결과 다음과 같이 예상보다 많은 결과를 얻었습니다.

>NC_03578.1>>NC_03578.1r>NC_03578.1e>NC_03578.1f>NC_03578.1|>NC_035780.1|>NC_03578.1 >NC_03578.1C>NC_03578.1r>NC_03578.1a>NC_03578.1s>NC_03578.1s>NC_03578.1o>NC_03578.1s>NC_03578.1t>NC_03578.1r>NC_03578.1e>NC_03578.1a>NC_03578.1   
...  

내가 뭘 잘못했나요?

답변1

주요 문제는 당신이 탈출했고 >이 경우 단어 경계 끝으로 작동하고 대체 연산자로 작동 |할 .GNU sed\>\|

$ sed 's/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1

수정된 명령은 위에 표시됩니다. 그리고 줄 끝에 공백이 좀 있는 것 같아서 추가해서 .*없애봤습니다. 작업 sed -n '/NC_/ s/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/p'자체 를 래핑하는 데 사용됩니다 grep.sed


당신은 또한 사용할 수 있습니다awk

$ awk -F'|' '/NC_/{print ">" $2}' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
  • -F'|'|필드 구분 기호로 정의됩니다 . |정규식 연산자이지만 FS필드 구분 기호(특수 awk 변수로 설정 )가 단일 문자인 경우 -F정규식으로 간주되지 않습니다 . -F'[|]'아니면 -F'\\|'작동할 수도 있지만 효율성이 떨어집니다.
  • /NC_/입력 라인에 다음이 포함된 경우NC_
    • print ">" $2>문자 및 두 번째 필드 인쇄

관련 정보