次の列を持つファイル(bigfile.txt)があります。
NW_017095471.1 Gnomon mRNA 108321 109565 . + . ID=rna34;Parent=gene27;Dbxref=GeneID:108565285,Genbank:XM_017925071.1;Name=XM_017925071.1;gbkey=mRNA;gene=LOC108565285;model_evidence=Supporting evidence includes similarity to: 7 Proteins%2C and 100%25 coverage of the annotated genomic feature by RNAseq alignments%2C including 30 samples with support for all annotated introns;product=transmembrane protein 126A;transcript_id=XM_017925071.1
ID=gene27;Dbxref=GeneID:108565285;Name=LOC108565285;gbkey=Gene;gene=LOC108565285;gene_biotype=protein_coding
ID=gene28;Dbxref=GeneID:108569527;Name=LOC108569527;gbkey=Gene;gene=LOC108569527;gene_biotype=protein_coding
ID=gene78;Dbxref=GeneID:108562956;Name=LOC108562956;gbkey=Gene;gene=LOC108562956;gene_biotype=protein_coding
別のリストがあります。
gene27
gene28
各行を取得し、IDフィールドに対してgrepを実行し、「Name =」の後に「LOC#」を返したいと思います。
gene=$line
`grep $gene";" bigfile.txt | sed -e 's/Name=
返品
LOC108565285
LOC108569527
この部分をどのように抽出できますか?
ベストアンサー1
これがタブで区切られた9番目のフィールドであるとしましょう。GFFファイルgene
(属性フィールド)以下を使用して、特定の属性(別々のファイルから読み取られる)に対応する属性値を抽出できます。ID
awk
BEGIN { FS = "\t" }
FNR == NR {
# Read IDs into a hash as keys.
ids[$1] = 1
next
}
$3 == "gene" {
# Split the attribute field into separate key-value pairs.
n = split($9, keyvalues, ";")
id = "" # Not found a gene ID yet
gene = "" # No gene name to print
# Loop over the key-value pairs, split them on the "="
# and extract the gene name and gene ID.
for (i = 1; i <= n; ++i) {
split(keyvalues[i], attr, "=")
if (attr[1] == "ID") {
if (attr[2] in ids)
id = attr[2]
else
next # This line is not of interest
}
else if (attr[1] == "gene")
gene = attr[2]
}
if (id != "" && gene != "")
print gene
}
file.gff
列9で指定されたデータと、次の場所にある遺伝子IDのリストを含むGFFファイルでそれを実行しますid.list
。
$ awk -f script.awk id.list file.gff
LOC108565285
LOC108569527
遺伝子IDのリストはFNR == NR
コードブロックの最初のファイルから読み取られ、最後のブロックはコマンドラインawk
で提供されている2番目(およびすべての後続)ファイル内の遺伝子フィーチャラインの属性フィールドを処理します。
コードはawk
、GFFファイルID
とgene
属性に単一の値しか含まれていない(カンマ区切り値のリストではない)、その値が引用符で囲まれていないと想定しています。
遺伝子名と遺伝子IDのリスト(2つの列)に出力するには、ステートメントをprint gene
に変更しますprint id, gene
。