awkを使用して列番号の代わりに名前でフィールドを抽出するには?

awkを使用して列番号の代わりに名前でフィールドを抽出するには?

私は大きなものを持っていますgtf。ここでeg.gtf次のように共有します。

chr22   Cufflinks       transcript      10695955        10696708        .       +       .       transcript_id "first_11345700"; gene_id "XLOC_158970"; gene_name "XLOC_158970"; oId "TCONS_00353198"; class_code "u"; tss_id "TSS369767"; original_gene_id "XLOC_158970";
chr22   Cufflinks       exon    10702915        10703826        .       +       .       transcript_id "first_11345701"; gene_id "ENSG00000277248.1"; gene_name "ENSG00000277248.1"; exon_number "1"; original_gene_id "ENSG00000277248.1";
chr22   Cufflinks       transcript      10702915        10707278        .       +       .       transcript_id "first_11345701"; gene_id "ENSG00000277248.1"; gene_name "ENSG00000277248.1"; oId "TCONS_00353199"; class_code "u"; tss_id "TSS369769"; original_gene_id "ENSG00000277248.1";

awk次の列番号を使用して必須フィールドを抽出しました。

cat eg.gtf | awk 'OFS="\t" {if ($3=="transcript") {print $1,$4-1,$5,$12,$7}}' | tr -d '";'

出力は次のとおりです。

chr22   10695954    10696708    XLOC_158970 +
chr22   10702914    10707278    ENSG00000277248.1   +

12コマンドに列番号を使用したくありませんが、awk名前のあるフィールドを抽出したいと思います。

メモ: 12th column has different names, starting with E or X or M or N or S

12コマンドに列番号を指定せずに12番目のフィールドをどのように取得できますかawkgene_id列11の用語を使用してフィールド12を取得する方法はありますか?

ベストアンサー1

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ cat tst.awk
BEGIN {
    FS=OFS="\t"
}
$3 == "transcript" {
    n = split($NF,tmp,/[; "]+/)
    for ( i=1; i<n; i+=2 ) {
        vals[tmp[i]] = tmp[i+1]
    }
    print $1, $4-1, $5, vals["gene_id"], $7
}

$ awk -f tst.awk file
chr22   10695954    10696708    XLOC_158970 +
chr22   10702914    10707278    ENSG00000277248.1   +

おすすめ記事