파일을 구문 분석하고 별도의 열에 쓰는 방법

파일을 구문 분석하고 별도의 열에 쓰는 방법

BGC 수를 계산하기 위해 안티스매시 출력을 구문 분석하려고 합니다. 저는 제가 전혀 모르는 Python으로 스크립트를 작성하는 사람들을 발견했습니다. 그래서 저는 이 문제를 해결하기 위해 bash 스크립트를 사용하려고 했습니다.

예측 클러스터가 포함된 유전자은행 형식 파일은 다음과 같습니다.

head -30 sca_11_chr8_3_0.region001.gbk
LOCUS       sca_11_chr8_3_0        45390 bp    DNA     linear   UNK 01-JAN-1980
DEFINITION  sca_11_chr8_3_0.
ACCESSION   sca_11_chr8_3_0
VERSION     sca_11_chr8_3_0
KEYWORDS    .
SOURCE
  ORGANISM
            .
COMMENT     ##antiSMASH-Data-START##
            Version      :: 6.0.1-a859617(changed)
            Run date     :: 2021-10-31 18:00:02
            NOTE: This is a single cluster extracted from a larger record!
            Orig. start  :: 169481
            Orig. end    :: 214871
            ##antiSMASH-Data-END##
FEATURES             Location/Qualifiers
     protocluster    1..45390
                     /aStool="rule-based-clusters"
                     /contig_edge="False"
                     /core_location="join{[194767:194871](-),
                     [194650:194652](-), [191596:194619](-),
                     [189481:191503](-)}"
                     /cutoff="20000"
                     /detection_rule="cds(Condensation and (AMP-binding or
                     A-OX))"
                     /neighbourhood="20000"
                     /product="NRPS"
                     /protocluster_number="1"
                     /tool="antismash"
     proto_core      complement(join(20001..22022,22116..25138,25170..25171,

tailsca_11_chr8_3_0.region001.gbk

    44881 ggagcttgtg gagagaagtg agacgtatcg cacgaatgct cttcagcaga tgctgggcag
    44941 ttagaggatt tgcactttag tttcatagag ttgatgtgtc gaggagataa tttgagatac
    45001 cagtatatgt aatttaccta cctacctagt cgagattgga cattgtacaa gagaaataac
    45061 aactaactat acgagacaag cctgatgtgt tgatagtttc attcatgtct ggtgtttgtg
    45121 gcatgtttat gttggagtag ctgtacagaa gataccgcgc tattcccagt gatcatggcc
    45181 cccacgcctc caactcggca cctgaccttg atcccctttg ggaagcatgt ctcagtgtct
    45241 cagccgtgag ccgtagaggc tgcacagcat ggagaagctg tcctgtcaat tcaggggatt
    45301 tgcccacggg ggctatcata tgatgaatct cggacaccct acacgttgtt accgcctttc
    45361 ttagctcctg ctggtagccg tcccctgaac
//

먼저 gbk 파일을 하나로 연결하여 예측된 모든 클러스터를 포함시킨 다음 궤적 ID, 클러스터의 시작과 끝, 클러스터 유형을 제공하는 문자를 grep했습니다.

cat sca_*.gbk > Necha2_SMclusters.gbk
grep "DEFINITION\|Orig\|product=" Necha2_SMclusters.gbk > Necha2_SMclusters_filtered.txt

이것은 나에게 다음과 같은 파일을 제공합니다

DEFINITION  sca_32_chr11_3_0.
            Orig. start  :: 381231
            Orig. end    :: 428233
                     /product="T1PKS"
                     /product="T1PKS"
                     /product="T1PKS"
                     /product="T1PKS"
DEFINITION  sca_32_chr11_3_0.
            Orig. start  :: 464307
            Orig. end    :: 486217
                     /product="terpene"
                     /product="terpene"
                     /product="terpene"
                     /product="terpene"
DEFINITION  sca_33_chr6_1_0.
            Orig. start  :: 140267
            Orig. end    :: 227928
                     /product="NRPS-like"
                     /product="T1PKS"
                     /product="NRPS-like"
                     /product="T1PKS"
                     /product="NRPS-like"
                     /product="NRPS-like"
                     /product="NRPS-like"
                     /product="T1PKS"
                     /product="T1PKS"
                     /product="T1PKS"
DEFINITION  sca_39_chr11_5_0.
            Orig. start  :: 270154
            Orig. end    :: 324310
                     /product="NRPS"
                     /product="NRPS"
                     /product="NRPS"
                     /product="NRPS"

이 파일에서 아래와 같은 파일을 얻고 싶습니다.

Locus name  start   end ClusterType
sca_9_chr7_10_0.    369577  421460  T1PKS,NRPS
sca_33_chr6_1_0.    140267  227928  NRPS-like, T1PKS
sca_32_chr11_3_0    381231  428233  T1PKS

이제 이것이 예측된 모든 클러스터를 포함하는 파일이 필요한 것입니다.

매우 감사합니다! !

답변1

다음 예제 입력을 고려하면 다음과 같습니다.

$ cat file1.gbk
DEFINITION  sca_32_chr11_3_0.
foo
            Orig. start  :: 381231
            Orig. end    :: 428233
                     /product="T1PKS"
                     /product="T1PKS"
bar
                     /product="T1PKS"
                     /product="T1PKS"
//
stuff
DEFINITION  sca_32_chr11_3_0.
            Orig. start  :: 464307
            Orig. end    :: 486217
                     /product="terpene"
nonsense
                     /product="terpene"
                     /product="terpene"
                     /product="terpene"
//
DEFINITION  sca_33_chr6_1_0.
            Orig. start  :: 140267
            Orig. end    :: 227928
                     /product="NRPS-like"
                     /product="T1PKS"
whatever
                     /product="NRPS-like"
                     /product="T1PKS"
                     /product="NRPS-like"
                     /product="NRPS-like"
                     /product="NRPS-like"
                     /product="T1PKS"
                     /product="T1PKS"
                     /product="T1PKS"

$ cat file2.gbk
here we go
DEFINITION  sca_39_chr11_5_0.
            Orig. start  :: 270154
more irrelevant text
            Orig. end    :: 324310
                     /product="NRPS"
                     /product="NRPS"
                     /product="NRPS"
                     /product="NRPS"

이 스크립트는 다음과 같습니다.

$ cat tst.awk
BEGIN { OFS="\t" }
$1 == "DEFINITION"    {
    if ( ++cnt == 1 ) {
        print "Locus name", "start", "end", "ClusterType"
    }
    prt()
    locus = $2
}
/Orig\. start/        { start = $NF }
/Orig\. end/          { end = $NF }
sub(".*/product=","") { gsub(/"/,""); types[$NF] }
END { prt() }

function prt(   ct, type) {
    if ( locus != "" ) {
        for (type in types) {
            ct = (ct=="" ? "" : ct ",") type
        }
        print locus, start, end, ct
    }
    delete types
    locus = ""
}

다음과 같은 출력이 생성됩니다.

$ awk -f tst.awk *.gbk
Locus name      start   end     ClusterType
sca_32_chr11_3_0.       381231  428233  T1PKS
sca_32_chr11_3_0.       464307  486217  terpene
sca_33_chr6_1_0.        140267  227928  T1PKS,NRPS-like
sca_39_chr11_5_0.       270154  324310  NRPS

관련 정보