私の問題は次のようになりますこれしかし、抽出したい部分がその行内にあるので、出力ではなく元のファイルの新しく作成された列にも保存したいと思います。
タブ区切りファイルの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
上記のスクリプトはどこにありますか?