У меня есть файл gff, я хочу извлечь идентификаторы гена (столбец 9) и цепь (+ или -) (столбец 7). Я хочу сделать это в bash, но не знаю, как это сделать. Я хочу извлечь только строку, в которой есть тип объекта Gene (столбец 3).
я попробовал это:
#!/bin/bash
gff_file = "$1"
sequence_id = "$2"
gene_ids=$(zcat "$gff_file" | awk -F'\t' -v seq_id = "$sequence_id" '$1 == seq_id && $3 == "gene" {match($9, /ID=([^;]+)/, arr); print arr[1]$7}')
if [ -z "$gene_ids" ]; then
exit 0
fi
sorted_gene_ids=$(echo "$gene_ids" | sort -nk2 | awk '{print $1}')
echo "$sorted_gene_ids"
мой gff-файл выглядит так:
chr1 v1.0 gene 289 3692 . - . ID=Oeu061231.1;tid=PAC:37727357;id=gOeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
chr1 v1.0 mRNA 289 3692 . - . ID=Oeu061231.1;Parent=Oeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
chr1 v1.0 exon 289 349 . - . ID=Oeu061231.1:exon:1;Parent=Oeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
chr1 v1.0 CDS 289 349 . - 1 ID=Oeu061231.1:CDS;Parent=Oeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
chr1 v1.0 exon 473 787 . - . ID=Oeu061231.1:exon:2;Parent=Oeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
chr1 v1.0 CDS 473 787 . - 1 ID=Oeu061231.1:CDS;Parent=Oeu061231.1;Name=Oeu061231.1;gene_id=Oeu061231.1
...
chr2 v1.0 gene 21189213 21190423 . + . ID=Oeu046640.1;tid=PAC:37723918;id=gOeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 mRNA 21189213 21190423 . + . ID=Oeu046640.1;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 exon 21189213 21189336 . + . ID=Oeu046640.1:exon:1;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 CDS 21189213 21189336 . + 0 ID=Oeu046640.1:CDS;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 exon 21189890 21189977 . + . ID=Oeu046640.1:exon:2;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 CDS 21189890 21189977 . + 2 ID=Oeu046640.1:CDS;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 exon 21190084 21190150 . + . ID=Oeu046640.1:exon:3;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 CDS 21190084 21190150 . + 1 ID=Oeu046640.1:CDS;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 exon 21190370 21190423 . + . ID=Oeu046640.1:exon:4;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
chr2 v1.0 CDS 21190370 21190423 . + 0 ID=Oeu046640.1:CDS;Parent=Oeu046640.1;Name=Oeu046640.1;gene_id=Oeu046640.1
когда я вызываю файл .sh, я также хочу фильтровать хромосому, поэтому, например, я бы использовал его так:
gene_id_extracter.sh example.gff.gz "chr2"
я ожидал, что результат будет выглядеть так:
Oeu046640.1+
Чтобы извлечь идентификаторы генов и цепочки из файла GFF с помощью bash, ориентируясь только на строки с типом объекта «ген» в столбце 3, вы можете использовать awk и sort.
#!/bin/bash
# Ensure a GFF file is provided
if [ $# -lt 1 ]; then
echo "Usage: $0 <gff_file>"
exit 1
fi
gff_file = "$1"
# Extract gene IDs and strands from the GFF file
gene_ids=$(awk -F'\t' '$3 == "gene" {match($9, /ID=([^;]+)/, arr); print arr[1] $7}' "$gff_file")
# Check if gene_ids is empty
if [ -z "$gene_ids" ]; then
exit 0
fi
# Sort and print the gene IDs with their strands
sorted_gene_ids=$(echo "$gene_ids" | sort)
echo "$sorted_gene_ids"
Это похоже на то, что вы, вероятно, хотите:
$ cat tst.sh
#!/usr/bin/env bash
zgrep "^$2"$'\t' "$1" | awk -F'[\t=]+' '$3 == "gene" { print $NF $7; exit }'
$ ./tst.sh example.gff.gz chr2
Oeu046640.1+
Мы используем zgrep regexp | awk '...'
вместо zcat | awk '/regexp/...'
или аналогичный для повышения эффективности, поскольку первый требует zgrep
для чтения каждой строки сжатого файла, но awk
видит только строки, содержащие chr2
, до строки gene
, тогда как второй требует, чтобы и zcat
, и awk
читали каждую строку сжатый файл.
Кажется, это работает только для распечатки одного идентификатора гена, но некоторые хромосомы имеют два идентификатора гена, и тогда он не будет распечатывать все разные идентификаторы гена. Я знаю, что не уточнил, что иногда это так, мои извинения.
Хорошо, подождите, я нашел это, спасибо! если я просто удалю; выход в операторе awk, он распечатывает все идентификаторы генов, спасибо за решение!
вам следует отредактировать свой вопрос и добавить несколько примеров строк файла GFF (в виде блока кода) и результат, который вы хотите получить от него. Я имею в виду, откуда нам знать, что вы пытаетесь обработать?