Как я могу получить доступ к двум столбцам в файле gff и объединить их с помощью bash?

У меня есть файл 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

gff_file

когда я вызываю файл .sh, я также хочу фильтровать хромосому, поэтому, например, я бы использовал его так:

gene_id_extracter.sh example.gff.gz "chr2"

я ожидал, что результат будет выглядеть так:

Oeu046640.1+

вам следует отредактировать свой вопрос и добавить несколько примеров строк файла GFF (в виде блока кода) и результат, который вы хотите получить от него. Я имею в виду, откуда нам знать, что вы пытаетесь обработать?

Fravadona 25.05.2024 15:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы извлечь идентификаторы генов и цепочки из файла 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 читали каждую строку сжатый файл.

Кажется, это работает только для распечатки одного идентификатора гена, но некоторые хромосомы имеют два идентификатора гена, и тогда он не будет распечатывать все разные идентификаторы гена. Я знаю, что не уточнил, что иногда это так, мои извинения.

etbusserke 26.05.2024 10:01

Хорошо, подождите, я нашел это, спасибо! если я просто удалю; выход в операторе awk, он распечатывает все идентификаторы генов, спасибо за решение!

etbusserke 26.05.2024 10:06

Другие вопросы по теме