私の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
3番目の列で次のコマンドを試してみましたが、次のように5番目と4番目の列を使用して番号を取得しようとしました。
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