awk/sed는 클러스터 파일을 여러 파일로 분할합니다.

awk/sed는 클러스터 파일을 여러 파일로 분할합니다.

다음과 같은 클러스터 fasta 파일(파일이라고 함)이 있습니다.

>1AB2
>1AB2 AA
NWWIEUNJRNIBGOWNGIOWGRBIGBRGRIOWGI
NCIDHFR8EHGBVPIWOBGIGRI
>1AB3 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>1SC4 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>2CD5 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>2AC6
>2AC6 AA
NFIGEURHGEIROHEGHTUTJGENLJBBEOWRIU
NFIROUHBOERVERUGBERUOVREOIBROEBVUE
NVHIRE
>2ONM AA
BUCIEHBUORBREOBWQVURVELLAJFLHIEBGR
NHEIBVEURIGBVNRIHEOEAJVSJDNHVUGBVR
NEBIBVVBRU
>2POD AA
BUFEWIBOEUWBWOREBRIUBGUERIGBVOSRIP
BUEIBVEO
>7KZL
>7KZL AA
BUIREBVAUREVBREOIRGPNJBFDVERUBVROR
>6HG3
>6GH3 AA
NBVUIREVOIAWRHRUGRTYUVDNJKDFHUGSEI
FHUIERBLUUIREB
>6GH4 AA
BDFUIGEVUERERHOBERIHBSDLKFJBNIERIH
NFHILRUGAURHG

정보 파일에는 다음과 같은 4개의 그룹이 있습니다. 1AB2, 2AC6, 7KZL, and 6GH3첫 번째 >1AB2및 첫 번째 기간 의 내용은 >2AC6이 클러스터에 속합니다 1AB2. 첫 번째 >2AC6및 첫 번째 기간 의 내용은 >7KZL이 클러스터에 속합니다 2AC6.

두 번째 파일을 4개의 파일로 분할하고 싶습니다 >XXXX. 각 파일은 다음과 같아야 합니다.

파일 1

>1AB2 AA
NWWIEUNJRNIBGOWNGIOWGRBIGBRGRIOWGI
NCIDHFR8EHGBVPIWOBGIGRI
>1AB3 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>1SC4 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>2CD5 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN

파일_2

>2AC6 AA
NFIGEURHGEIROHEGHTUTJGENLJBBEOWRIU
NFIROUHBOERVERUGBERUOVREOIBROEBVUE
NVHIRE
>2ONM AA
BUCIEHBUORBREOBWQVURVELLAJFLHIEBGR
NHEIBVEURIGBVNRIHEOEAJVSJDNHVUGBVR
NEBIBVVBRU
>2POD AA
BUFEWIBOEUWBWOREBRIUBGUERIGBVOSRIP
BUEIBVEO

파일_3

>7KZL AA
BUIREBVAUREVBREOIRGPNJBFDVERUBVROR

파일_4

>6GH3 AA
NBVUIREVOIAWRHRUGRTYUVDNJKDFHUGSEI
FHUIERBLUUIREB
>6GH4 AA
BDFUIGEVUERERHOBERIHBSDLKFJBNIERIH
NFHILRUGAURHG

답변1

awk '/^>/ && NF==1 {close(out); out="file_"++n; next} {print > out}' file

>테스트 입력을 기반으로 출력 파일의 헤더 정의를 하나의 필드와 하나의 필드로 시작하는 줄로 변경하려고 합니다 . 이 줄을 사용하면 next아무것도 인쇄하지 않지만 출력 파일 이름을 설정합니다. 또한 close()이 호출은 오류가 발생할 수 있는 너무 많은 파일이 열려 있지 않은지 확인합니다 awk.


산출:

$ head file_*
==> file_1 <==
>1AB2 AA
NWWIEUNJRNIBGOWNGIOWGRBIGBRGRIOWGI
NCIDHFR8EHGBVPIWOBGIGRI
>1AB3 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>1SC4 AA
WNIOREHUEBRGOUERGHBERGIORBGREUGEGO
NWFWRUBGREOUEREOBRIOBNERIOBN
>2CD5 AA

==> file_2 <==
>2AC6 AA
NFIGEURHGEIROHEGHTUTJGENLJBBEOWRIU
NFIROUHBOERVERUGBERUOVREOIBROEBVUE
NVHIRE
>2ONM AA
BUCIEHBUORBREOBWQVURVELLAJFLHIEBGR
NHEIBVEURIGBVNRIHEOEAJVSJDNHVUGBVR
NEBIBVVBRU
>2POD AA
BUFEWIBOEUWBWOREBRIUBGUERIGBVOSRIP

==> file_3 <==
>7KZL AA
BUIREBVAUREVBREOIRGPNJBFDVERUBVROR

==> file_4 <==
>6GH3 AA
NBVUIREVOIAWRHRUGRTYUVDNJKDFHUGSEI
FHUIERBLUUIREB
>6GH4 AA
BDFUIGEVUERERHOBERIHBSDLKFJBNIERIH
NFHILRUGAURHG
thanasis@basis:~/Documents/development/temp> 
```

답변2

당신은 그것을 사용할 수 있습니다 csplit:

csplit --prefix file_ --elide-empty-files --suppress-matched file '/^>....$/' '{*}'

필요한 콘텐츠 file_00로 이름이 지정된 4개의 파일이 생성됩니다 ._03

답변3

사용 awk+sed조합:

awk -v f="wfile_" '
/^>/ && length==5 {
  if (a++) print p, ",", NR-1, f a-1
  p=NR+1
}
END {print p, ",$" f a}' < file |
split -l 10
for f in x*; do
sed -nf "$f" file
done

awk를 사용하여 블록 스타터의 줄 번호를 결정한 /^>.{4}$/다음 적절한 sed 코드를 빌드합니다.

관련 정보