awkまたはsedを使用して特定のパターンの部分行を抽出し、新しいフィールドに保存する

awkまたはsedを使用して特定のパターンの部分行を抽出し、新しいフィールドに保存する

私の問題は次のようになりますこれしかし、抽出したい部分がその行内にあるので、出力ではなく元のファイルの新しく作成された列にも保存したいと思います。

タブ区切りファイルの1行は次のとおりです。

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig

$9から「gene_name」以降の内容を抽出したいと思います。この行はRUNX3です。

予想出力:

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig    RUNX3

awkまたはsedを使用してこれをどのように実行できますか?

答え1

これで区切り文字がわかりましたので、区切り記号を分割して再グループ化してください。

sed -Ei 's/(.*gene_name=)([^;]*)(;.*)/\1\2\3\t\2/g' gene

に分かれています。

(.*gene_name=)

gene_name タグまでのすべての文字列は変数 1 に入ります。

([^;]*)

;変数2に入る前のすべての連続文字

(;.*)

文字列の残りの部分は変数3に入ります。

\1\2\3\t\2

タブと追加された遺伝子を使用して文字列を再構築します。

編集する

または@Weijunが言ったように

\0\t\2

他の編集者

コードゴルフ

sed -Ei 's/.*gene_name=([^;]*).*/\0\t\1/g' gene

答え2

そしてgawk

gawk 'match($9,/^.*gene_name=([^;]*);.*/,arr) {print $0"\t"arr[1]}'

これにより、文字列 "gene_name=" を含む各行の末尾に gene_name が追加されます。必要に応じて細かく調整できます。

答え3

次の内容awkも役に立ちます。

awk '{val=$0;sub(/.*gene_name=/,"",val);sub(/\;.*/,"",val);print $0,val}' Input_file

答え4

awk以下は、ファイルのプロパティフィールド(タブで区切られた9番目のフィールド)から特定の名前のフィールドを解析する一般的なソリューションです。一般機能形式(GFF):

BEGIN { OFS = FS = "\t" }

function get_attrib_by_name(key,  n,attrib,kv) {
    # Split the attribute field on semi-colons.
    n = split($9, attrib, ";")

    # Loop over the attributes and split each on "=".
    # When we've found the one we're looking for (by key name in "key"),
    # return the corresponding value.
    for (i = 1; i <= n; ++i) {
        split(attrib[i], kv, "=")
        if (kv[1] == key) {
            return kv[2]
        }
    }
}

# Using the above function.
{
    name = get_attrib_by_name("gene_name")
    print $0, name
}

これは次のように使用されます

$ awk -f script.awk file.gff

script.awk上記のスクリプトはどこにありますか?

関連情報