awk의 하위 문자열 대체

awk의 하위 문자열 대체

다음에서 탭으로 구분된 파일을 다운로드했습니다.여기:

##gff-version 3
#!gff-spec-version 1.21
#!processor NCBI annotwriter
#!genome-build Nsyl
#!genome-build-accession NCBI_Assembly:GCF_000393655.1
#!annotation-source NCBI Nicotiana sylvestris Annotation Release 100
##sequence-region NW_009338801.1 1 504
##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=4096
NW_009338801.1  RefSeq  region  1       504     .       +       .       ID=NW_009338801.1:1..504;Dbxref=taxon:4096;Name=Unknown;bio-material=USDA:TW 136;chrom
osome=Unknown;gbkey=Src;genome=genomic;mol_type=genomic DNA;tissue-type=leaf
##sequence-region NW_009338802.1 1 9484
##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=4096
NW_009338802.1  RefSeq  region  1       9484    .       +       .       ID=NW_009338802.1:1..9484;Dbxref=taxon:4096;Name=Unknown;bio-material=USDA:TW 136;chro
mosome=Unknown;gbkey=Src;genome=genomic;mol_type=genomic DNA;tissue-type=leaf
##sequence-region NW_009338803.1 1 7523
##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=4096
NW_009338803.1  RefSeq  region  1       7523    .       +       .       ID=NW_009338803.1:1..7523;Dbxref=taxon:4096;Name=Unknown;bio-material=USDA:TW 136;chro
mosome=Unknown;gbkey=Src;genome=genomic;mol_type=genomic DNA;tissue-type=leaf
##sequence-region NW_009338804.1 1 46372
##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=4096
NW_009338804.1  RefSeq  region  1       46372   .       +       .       ID=NW_009338804.1:1..46372;Dbxref=taxon:4096;Name=Unknown;bio-material=USDA:TW 136;chr
omosome=Unknown;gbkey=Src;genome=genomic;mol_type=genomic DNA;tissue-type=leaf
NW_009338804.1  Gnomon  pseudogene      32822   34172   .       -       .       ID=gene-LOC104209938;Dbxref=GeneID:104209938;Name=LOC104209938;gbkey=Gene;gene
=LOC104209938;gene_biotype=pseudogene;pseudo=true
NW_009338804.1  Gnomon  exon    32822   34172   .       -       .       ID=id-LOC104209938-1;Parent=gene-LOC104209938;Dbxref=GeneID:104209938;exon_number=1;gb
key=exon;gene=LOC104209938;model_evidence=Supporting evidence includes similarity to: 2 Proteins;number=1
##sequence-region NW_009338805.1 1 53328
##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=4096
NW_009338805.1  RefSeq  region  1       53328   .       +       .       ID=NW_009338805.1:1..53328;Dbxref=taxon:4096;Name=Unknown;bio-material=USDA:TW 136;chr
omosome=Unknown;gbkey=Src;genome=genomic;mol_type=genomic DNA;tissue-type=leaf
NW_009338805.1  Gnomon  gene    10570   12535   .       -       .       ID=gene-LOC104217587;Dbxref=GeneID:104217587;Name=LOC104217587;gbkey=Gene;gene=LOC1042
17587;gene_biotype=protein_coding
NW_009338805.1  Gnomon  mRNA    10570   12535   .       -       .       ID=rna-XM_009770987.1;Parent=gene-LOC104217587;Dbxref=GeneID:104217587,Genbank:XM_0097
70987.1;Name=XM_009770987.1;gbkey=mRNA;gene=LOC104217587;model_evidence=Supporting evidence includes similarity to: 100%25 coverage of the annotated genomic f
eature by RNAseq alignments%2C including 2 samples with support for all annotated introns;product=ribosome-interacting GTPase 1-like;transcript_id=XM_00977098
7.1
NW_009338805.1  Gnomon  exon    12140   12535   .       -       .       ID=exon-XM_009770987.1-1;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XM_
009770987.1;gbkey=mRNA;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;transcript_id=XM_009770987.1
NW_009338805.1  Gnomon  exon    11826   11939   .       -       .       ID=exon-XM_009770987.1-2;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XM_009770987.1;gbkey=mRNA;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;transcript_id=XM_009770987.1
NW_009338805.1  Gnomon  exon    11521   11695   .       -       .       ID=exon-XM_009770987.1-3;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XM_009770987.1;gbkey=mRNA;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;transcript_id=XM_009770987.1
NW_009338805.1  Gnomon  exon    10570   10889   .       -       .       ID=exon-XM_009770987.1-4;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XM_009770987.1;gbkey=mRNA;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;transcript_id=XM_009770987.1
NW_009338805.1  Gnomon  CDS     12140   12154   .       -       0       ID=cds-XP_009769289.1;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XP_009769289.1;Name=XP_009769289.1;gbkey=CDS;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;protein_id=XP_009769289.1
NW_009338805.1  Gnomon  CDS     11826   11939   .       -       0       ID=cds-XP_009769289.1;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XP_009769289.1;Name=XP_009769289.1;gbkey=CDS;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;protein_id=XP_009769289.1
NW_009338805.1  Gnomon  CDS     11521   11695   .       -       0       ID=cds-XP_009769289.1;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XP_009769289.1;Name=XP_009769289.1;gbkey=CDS;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;protein_id=XP_009769289.1
NW_009338805.1  Gnomon  CDS     10813   10889   .       -       2       ID=cds-XP_009769289.1;Parent=rna-XM_009770987.1;Dbxref=GeneID:104217587,Genbank:XP_009769289.1;Name=XP_009769289.1;gbkey=CDS;gene=LOC104217587;product=ribosome-interacting GTPase 1-like;protein_id=XP_009769289.1
...

다음 명령은 NW_009592716.1.lst, NC_007500.1.lst 등과 같이 서로 다른 열 이름에 대해 여러 파일을 생성할 수 없습니다.

cat GCF_000393655.1_Nsyl_genomic.gff |awk '$3=="CDS"' |
    sed 's/;/\t/g' |
    awk '{print $1,$7,$12}' |
    sed 's/Name=//g' |
    awk 'substr($3,11,11)==1 {print $3$2,$1}'  |
    sort |
    uniq |
    awk '{print >> $2 ".lst"; close($2)}'

여러 파일 대신 하나의 파일만 생성합니다.

$ head NC_007500.1.lst
YP_358649.1- NC_007500.1
YP_358650.1+ NC_007500.1
YP_358650.1- NC_007500.1
YP_358651.1- NC_007500.1
YP_358652.1- NC_007500.1
YP_358653.1- NC_007500.1
YP_358654.1+ NC_007500.1
YP_358655.1+ NC_007500.1
YP_358656.1+ NC_007500.1
YP_358657.1- NC_007500.1
...

위 명령을 다른 문자열 길이에 허용하려면 어떻게 해야 합니까?

미리 감사드립니다.

답변1

주석에서 언급했듯이 AWK 및 sed 호출의 전체 체인을 단일 AWK 프로그램으로 구현하는 것이 가능해야 합니다.

요청한 질문에 답하고 세 번째 필드의 마지막 문자가 "1"인지 확인하려면 다음을 사용할 수 있습니다.

$3 ~ /1$/

대신 substr, 귀하의 경우에는

$3 ~ /1$/ {print $3$2,$1}

답변2

나는 그것을 알아

$3 == "CDS" && $1 ~ /1$/ {
        split($9,A,";") ;
        B=substr(A[4],6) ;
        V[B $7] = $1 ;
}
END {
        for (u in V) {
                print u  >> V[u] ;
                close(V[u]) ;
        }
}

결과는 17042개의 파일입니다.

  • $3 == "CDS" && $1 ~ /1$/ 그리고awk '$3=="CDS"'awk 'substr($3,11,11)==1
  • split($9,A,";") ;그리고 sed 's/;/\t/g'awk '{print $1,$7,$12}'
  • B=substr(A[4],6) ;~을 위한sed 's/Name=//g'
  • V[B $7] = $1 ;그리고sortuniq

스크립트를 실행하려면 코드를 삽입한 filter.awk다음

awk -f filter.awk file_to_parse

답변3

gawk및 변수를 사용하여 tgt선택할 필드의 이름을 정의합니다.

awk -F"[\t;:,=]" -v tgt="Genbank" '$3=="CDS"{
   for (f=4; f<=NF; f++) if ($f ~ tgt) {
     if ( $(f+1) ~ /\.1$/ ) out[$(f+1)$7" "$1]=$1".lst"}}
   END{PROCINFO["sorted_in"]="@ind_num_asc"; 
      for (o in out) print o > out[o]}' GCF_000393655.1_Nsyl_genomic.gff

tail *.lst 

==> NW_009592652.1.lst <==
XP_009779696.1- NW_009592652.1

==> NW_009592685.1.lst <==
XP_009779697.1+ NW_009592685.1
XP_009779699.1- NW_009592685.1

==> NW_009592688.1.lst <==
XP_009779700.1+ NW_009592688.1
XP_009779701.1+ NW_009592688.1
XP_009779702.1+ NW_009592688.1

==> NW_009592716.1.lst <==
XP_009779703.1+ NW_009592716.1

댓글을 기반으로 반복 tgt="Parent"하여 입력하세요.test.gff3

tail *.lst

==> NbV1Ch18.lst <==
NBlab18G26040.1+ NbV1Ch18
NBlab18G26050.1- NbV1Ch18
NBlab18G26060.1+ NbV1Ch18
NBlab18G26070.1+ NbV1Ch18
NBlab18G26080.1- NbV1Ch18
NBlab18G26090.1- NbV1Ch18
NBlab18G26100.1- NbV1Ch18
NBlab18G26110.1- NbV1Ch18
NBlab18G26120.1+ NbV1Ch18
NBlab18G26130.1+ NbV1Ch18

==> NbV1Ch19.lst <==
NBlab19G29030.1+ NbV1Ch19
NBlab19G29040.1- NbV1Ch19
NBlab19G29050.1- NbV1Ch19
NBlab19G29060.1- NbV1Ch19
NBlab19G29070.1+ NbV1Ch19
NBlab19G29080.1+ NbV1Ch19
NBlab19G29090.1- NbV1Ch19
NBlab19G29100.1- NbV1Ch19
NBlab19G29110.1- NbV1Ch19
NBlab19G29120.1- NbV1Ch19

송곳

필요한 필드를 선택 tgt하고 먼저 레코드를 선택하세요.CDS

awk -F"[\t;:,=]" -v tgt="Genbank" '$3=="CDS"{

찾을 때까지 필드를 반복합니다.tgt

   for (f=4; f<=NF; f++) if ($f ~ tgt) {

대상 필드 값이 $(f+1)로 끝나는 지 확인하십시오 .1. 그렇다면 out이동하려는 파일 이름 값이 있는 배열에 형식화된 출력을 저장하십시오.

     if ( $(f+1) ~ /\.1$/ ) out[$(f+1)$7" "$1]=$1".lst"}}

완료되면 awk배열에 인덱싱된 숫자를 기준으로 오름차순으로 출력 배열을 반복하도록 설정합니다.

   END{PROCINFO["sorted_in"]="@ind_num_asc"; 

그런 다음 배열을 반복하고 원하는 인덱스를 o해당 파일에 인쇄하십시오.out[o]

      for (o in out) print o > out[o]}' GCF_000393655.1_Nsyl_genomic.gff

관련 정보