awk를 사용하여 원하는 출력을 얻고 출력을 다른 파일에 추가하려면 어떻게 해야 합니까?

awk를 사용하여 원하는 출력을 얻고 출력을 다른 파일에 추가하려면 어떻게 해야 합니까?

test.gtf파일은 다음과 같습니다.

테스트.gtf

chr2      Cufflinks       exon    5072    5353    .       -       .       transcript_id "transc_00000019"; gene_id "XLOC_000017"; gene_name "XLOC_000017"; exon_number "1"; inf "unknown"; Other "XLOC_000017";
chr2      Cufflinks       transcript      5072    5353    .       -       .       transcript_id "transc_00000019"; gene_id "XLOC_000017"; gene_name "XLOC_000017"; oId "TCONS_00000019"; class_code "u"; tss_id "TSS19"; inf "unknown"; original_gene_id "XLOC_000017";
chr2      Cufflinks       exon    20450   20769   .       +       .       transcript_id "transc_00000001"; gene_id "XLOC_000001"; gene_name "XLOC_000001"; exon_number "1"; inf "unknown"; original_gene_id "XLOC_000001";
chr2      Cufflinks       transcript      20450   20769   .       +       .       transcript_id "transc_00000001"; gene_id "XLOC_000001"; gene_name "XLOC_000001"; oId "TCONS_00000001"; class_code "u"; tss_id "TSS1"; inf "unknown"; original_gene_id "XLOC_000001";
chr2      Cufflinks       exon    24985   25273   .       +       .       transcript_id "transc_00000002"; gene_id "XLOC_000002"; gene_name "XLOC_000002"; exon_number "1"; inf "unknown"; original_gene_id "XLOC_000002";
chr2      Cufflinks       transcript      24985   25273   .       +       .       transcript_id "transc_00000002"; gene_id "XLOC_000002"; gene_name "XLOC_000002"; oId "TCONS_00000002"; class_code "u"; tss_id "TSS2"; inf "unknown"; original_gene_id "XLOC_000002";
chr2      Cufflinks       exon    43499   43705   .       +       .       transcript_id "transc_00000003"; gene_id "XLOC_000003"; gene_name "XLOC_000003"; exon_number "1"; inf "unknown"; original_gene_id "XLOC_000003";
chr2      Cufflinks       transcript      43499   43705   .       +       .       transcript_id "transc_00000003"; gene_id "XLOC_000003"; gene_name "XLOC_000003"; oId "TCONS_00000003"; class_code "u"; tss_id "TSS3"; inf "unknown"; original_gene_id "XLOC_000003";

transcript세 번째 열에서 다음 명령을 사용해 보았고 다음과 같이 다섯 번째와 네 번째 열을 사용하여 숫자를 가져오려고 했습니다.

awk -F"\t" '$3=="transcript" {ID=substr($9, length($9)-16, 15); L[ID]+=$5-$4+1}
           END{for(i in L){print i"\t"L[i]}}' test.gtf

그러나 위의 명령은 출력을 제공하지 않습니다. 출력은 다음과 같아야 합니다.

transcript_id   num
transc_00000019 282 
transc_00000001 320
transc_00000002 289
transc_00000003 207

test2.tsv다음과 같은 또 다른 파일이 있습니다 .

gene_id           transcript_id      column3       column4     column5  column6
XLOC_000017      transc_00000019         -             -          -         - 
XLOC_000001      transc_00000001         -             -          -         - 
XLOC_000002      transc_00000002         -             -          -         - 
XLOC_000003      transc_00000003         -             -          -         - 

내가 얻은 출력은 파일의 다른 열로 추가되어야 하며 test2.tsv다음과 같아야 합니다.

test2.tsv

gene_id           transcript_id      column3       column4     column5  column6     num
XLOC_000017      transc_00000019         -             -          -         -        282
XLOC_000001      transc_00000001         -             -          -         -        320
XLOC_000002      transc_00000002         -             -          -         -        289
XLOC_000003      transc_00000003         -             -          -         -        207

답변1

를 사용하세요 awk. 구분 기호가 공백 이상인 경우 시도해 볼 수 있습니다.

$ awk -F' +|"' 'NR==FNR {a[$11]=$5-$4+1;next} FNR==1{$(NF+1)="num"}{print $0,a[$2]}' test.gtf test2.tsv | column -t

그러나 실제로 탭인 경우에는 시도해 볼 수 있습니다.

awk -F'\t|"' 'NR==FNR {a[$11]=$5-$4+1;next} FNR==1{$(NF+1)="num"}{print $0,a[$2]}' test.gtf test2.tsv | column -t

산출

gene_id      transcript_id    column3  column4  column5  column6  num
XLOC_000017  transc_00000019  -        -        -        -        282
XLOC_000001  transc_00000001  -        -        -        -        320
XLOC_000002  transc_00000002  -        -        -        -        289
XLOC_000003  transc_00000003  -        -        -        -        207

답변2

입력 필드 사이의 공백은 탭이 아니므로 awk에게 tab이라고 알리는 대신 해당 문을 제거하고 다음 으로 -F"\t"변경하세요 (또는 원하는 경우 $0 대신 $NF를 사용하세요).ID=substr($9, length($9)-16, 15)ID=substr($0, length($0)-16, 15)

$ awk '$3=="transcript" {ID=substr($0, length($0)-16, 15); L[ID]+=$5-$4+1}
           END{for(i in L){print i"\t"L[i]}}' test.gtf
id "XLOC_000017 282
id "XLOC_000001 320
id "XLOC_000002 289
id "XLOC_000003 207

통화에 사용 중인 전화번호 substr()가 닫혀 있고 앞에 추가 항목이 누락된 것 같습니다 transc_. 이 문제를 해결해 주시기 바랍니다.

위의 내용은 입력한 공백에 관계없이 작동합니다.

그런데 내장 변수 이름과 충돌하지 않도록 변수 이름을 모두 대문자로 사용하지 마세요. 또한 l변수 이름에 문자를 사용하지 마세요. 숫자와 너무 비슷해 보이기 때문입니다 1. 또는 OFS를 사용하여 구분된 출력 필드의 내용을 지정합니다.

$ awk -v OFS='\t' '$3=="transcript" {id=substr($0, length($0)-16, 15); num[id]+=$5-$4+1}
           END{for(id in num){print id, num[id]}}' test.gtf
id "XLOC_000017 282
id "XLOC_000001 320
id "XLOC_000002 289
id "XLOC_000003 207

관련 정보