AWK - вывод на печать - PullRequest
       8

AWK - вывод на печать

0 голосов
/ 22 апреля 2020

У меня есть таблица данных в формате tsv, содержимое файла выглядит следующим образом:

    Gene_stable_ID  Gene_stable_ID_version  Transcript_stable_ID    Transcript_stable_ID_version    Gene_name   Gene_type
ENSMUSG00000064372  ENSMUSG00000064372.1    ENSMUST00000082423  ENSMUST00000082423.1    Cyp Mt_tRNA
ENSMUSG00000064371  ENSMUSG00000064371.1    ENSMUST00000082422  ENSMUST00000082422.1    mt-Tt   unprocessed_pseudogene
ENSMUSG00000064370  ENSMUSG00000064370.1    ENSMUST00000082421  ENSMUST00000082421.1    Cyp processed_pseudogene
ENSMUSG00000064369  ENSMUSG00000064369.1    ENSMUST00000082420  ENSMUST00000082420.1    Cyp pseudogene

Моя цель здесь - получить строки, в которых «Gene name» равно «Cyp» и «Тип гена» - это «protein_coding» или «pseudogene», или «processing_pseudogene», или «processing_pseudogene».

Я использовал для этого команду awk, вот так.

grep -i Cyp mapping.tsv | awk -F "\t" '{ if($NF == "protein_coding" || $NF == "pseudogene" || $NF == "processed_pseudogene") { print }}'

Здесь я получите только «Имя гена» - Cyp и «Тип гена» - protein_coding, часть «псевдоген» игнорируется.

Можете ли вы помочь мне разобраться в этом? Спасибо.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Не могли бы вы попытаться выполнить следующие действия.

awk '$(NF-1)~/Cyp[0-9]+/ && ($NF=="protein_coding" || $NF=="pseudogene" || $NF=="processed_pseudogene" || $NF=="processed_pseudogene"){print $(NF-1),$NF}' Input_file

ИЛИ не одну из указанных выше форм вкладыша:

awk '
$(NF-1)~/Cyp[0-9]+/ && ($NF=="protein_coding" || $NF=="pseudogene" || $NF=="processed_pseudogene" || $NF=="processed_pseudogene"){
  print $(NF-1),$NF
}'  Input_file

Учитывая, что ваши поля Gene_name или Gene_type don ' здесь нет пробелов в их именах. Также для печати полной строки удалите {print $(NF-1),$NF} часть в вышеуказанных кодах.

РЕДАКТИРОВАТЬ: В случае, если вы хотите использовать регулярное выражение для проверки условия, используйте следующие (снова требуется регулярное выражение быть измененным согласно вашим образцам тоже):

awk '
$(NF-1)~/Cyp[0-9]+/ && ($NF=="protein_coding" || $NF~/.*pseudogene/ || $NF=="processed_pseudogene"){
  print $(NF-1),$NF
}'  Input_file
1 голос
/ 22 апреля 2020

Не совсем ответ, но в соответствии с вашим состоянием, я думаю, достаточно только grep.

try:

cat mapping.tsv |grep "Cyp"|grep -E "protein_coding|pseudogene|processed_pseudogene"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...