Как отфильтровать OTU по счетам с помощью AWK? - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь отфильтровать весь синглтон из файла fasta Вот мой входной файл:

 >OTU1;size=3;
 ATTCCCCGGGGGGG 
 >OTU2;size=1;
 ATCCGGGACTGATC
 >OTU3;size=5;
 GAACTATCGGGTAA
 >OTU4;size=1;
 AATTGGCCATCT

Ожидаемый результат:

>OTU1;size=3;
ATTCCCCGGGGGGG 
>OTU3;size=5;
GAACTATCGGGTAA

Я пробовал

awk -F'>' '{if($1>=2) {print $0}' input.fasta > ouput.fasta 

но при этом будут удалены все заголовки для каждого OTU.

Кто-нибудь может мне помочь?

Ответы [ 4 ]

2 голосов
/ 10 июня 2019
$ awk '/>/{f=/=1;/}!f' file
 >OTU1;size=3;
 ATTCCCCGGGGGGG
 >OTU3;size=5;
 GAACTATCGGGTAA
2 голосов
/ 10 июня 2019

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

awk -F'[=;]' '/^>/{flag=""} $3>=3{flag=1} flag'   Input_file
1 голос
/ 10 июня 2019
awk -v FS='[;=]' 'prev_sz>=2 && !/size/{print prev RS $0}   /size/{prev=$0;prev_sz=$(NF-1)}'

>OTU1;size=3;
 ATTCCCCGGGGGGG
 >OTU3;size=5;
 GAACTATCGGGTAA

Сохранить размер каждой строки в переменной prev_sz, а всю строку в переменных prev. Теперь проверьте, если это >= 2, затем напечатайте предыдущую строку и текущую строку. RS используется для печати новой строки.

0 голосов
/ 11 июня 2019

Хотя все вышеперечисленные методы работают, они ограничены тем, что ввод всегда должен выглядеть одинаково. Т.е. имя последовательности в вашем файле fasta должно иметь форму:

>NAME;size=value;

Несколько решений могут обрабатывать немного более расширенные имена последовательностей, но ни одно из них не обрабатывает случай, когда дела идут немного более обобщенно, т.е.

>NAME;label1=value1;label2=value2;STRING;label3=value3;

Последовательность печати, где метка xxx соответствует значению vvv:

awk '/>{f = /;xxx=vvv;/}f' file.fasta

Последовательность печати, где метка xxx имеет числовое значение p больше q:

awk -v label="xxx" -v limit=q \
    'BEGIN{ere=";" label "="}
     />/{ f=0; match($0,ere);value=0+substr($0,RSTART+length(ere)); f=(value>limit)}
     f' <file>

В приведенном выше ere - это регулярное выражение, которое мы пытаемся сопоставить. Мы используем его, чтобы найти расположение значения, прикрепленного к метке xxx. Эта подстрока будет иметь нечисловые символы после своего значения, но, добавив к ней 0, она преобразуется в число, теряя все нечисловые значения (т.е. 3;label4=value4; преобразуется в 3). Мы проверяем, превышает ли это значение наш лимит, и печатаем последовательность на основе этого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...