Sed - 개행 문자를 포함한 패턴과 일치하지만 제외합니다.

Sed - 개행 문자를 포함한 패턴과 일치하지만 제외합니다.

여러 fasta 형식의 입력이 있습니다. 기본적으로:

>header1
AAAAAATTTTCCCCGGGG
AAAATGTGTGTCTCTCTC
ATAGGATGAGT
>header2
GGGGTGTGTGATGTAGTA
AAAATGTGTGTCTCTCTC
ATAGGATGAGT
....
>header720
GGGGTGCTCGCTCTGTGA
AAAATGAGTCATCATTGT
ATAGGATGAGT

다음 형식으로 항목 #28을 복구하고 싶습니다.

>header28
GGGGTGCTCGCTCTGTGA
AAAATGAGTCATCATTGT
ATAGGATGAGT

내 초기 시도는 sed를 사용하는 것이 었습니다. 그러나 sed -n '/header28/,/>/p'('패턴과 일치하는 줄부터 다음 기호까지 모든 항목 가져오기>') 결과는 다음과 같습니다.

>header28
GGGGTGCTCGCTCTGTGA
AAAATGAGTCATCATTGT
ATAGGATGAGT
>header29

또한 sed -n '/header28/,/[^>]*/p'('기호를 포함하지 않고 패턴과 일치하는 행에서 모든 항목을 가져옵니다.')는 다음과 같이 개행 문자에 걸리기 때문에 필요한 것보다 짧은 시퀀스를 생성합니다.

>header28
GGGGTGCTCGCTCTGTGA

또한 이러한 옵션 중 어느 것도 항목이 목록의 마지막 항목일 가능성을 처리하지 않습니다(따라서 다른 >가 뒤에 오지 않음). 불가능하고 견딜 수 있지만 이를 처리하는 코드도 있으면 좋을 것입니다.

도와주셔서 감사합니다! sed 외에 다른 옵션도 열려 있지만 저는 단순한 것을 목표로 하고 있다고 생각합니다.

답변1

아마도 이것은 이미 요청되었을 것입니다... 하지만 어쨌든 범위 끝이 있는 경우 제거하십시오.

sed  '/>header28/,/>/!d;/>/{
     />header28/!d
     }' infile

답변2

awk를 사용하십시오.

$ awk '/^>/{f=(/>header28$/)} f' file
>header28
GGGGTGCTCGCTCTGTGA
AAAATGAGTCATCATTGT
ATAGGATGAGT

또는 더 효율적으로 나머지 입력 내용을 계속 읽는 대신 블록을 인쇄한 후 종료할 수 있습니다.

$ awk '/^>/{if (f) exit; f=(/>header28$/)} f' file
>header28
GGGGTGCTCGCTCTGTGA
AAAATGAGTCATCATTGT
ATAGGATGAGT

답변3

그리고 awk:

awk -v hdrId='header28' '
  /^>header/ && buf{ printf("%s", buf); exit }
  $0 ~ "^>" hdrId "$" || buf{ buf=buf $0 ORS }' infile

답변4

FastaToTbl 및 TblToFasta 스크립트(여기에서 스크립트를 참조하세요)다른 답변에서 언급했는데 다음을 수행하십시오.

$ FastaToTbl file.fa | grep -w header28 | TblToFasta
>header28 
GGGGTGCTCGCTCTGTGAAAAATGAGTCATCATTGTATAGGATGAGT

이는 20년 전에 이 스크립트가 작성되었을 때 표준이었던 60자 라인으로 시퀀스를 구분한다는 점에 유의하십시오. 이것은 fasta이므로 원래 행 접기를 유지할 필요가 없다고 가정합니다. 그렇지 않은 경우에는 알려주시기 바랍니다.

관련 정보