내 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