Определите, какие файлы имеют по крайней мере определенное количество строк, соответствующих шаблону - PullRequest
1 голос
/ 24 мая 2019

Я ищу способ идентифицировать FASTA -файлы как минимум с 3 последовательностями.Последовательности обозначены строками, начинающимися с >.

. Вот пример из 5 файлов:

file1

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG
>sp5
AGGGGGG

file2

>sp1
ATTTT

file3

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG

file4

>sp1
ATTTT
>sp3
ATTGG

file5

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG

Я хочу вывод:

file1
file3
file5 

, так как это файлыпо крайней мере, с тремя последовательностями.Могу ли я сделать это с ls?

Ответы [ 3 ]

4 голосов
/ 24 мая 2019

Это должно сделать работу:

grep -Hc '^>' * 2>/dev/null | awk -F':' '$2 > 3 {print $1}'

Как это работает:

  • grep -Hc '>' * считает строки, имеющие «>» во всем ('*')
  • 2>/dev/null подавляет сообщения об ошибках, поскольку grep -ing on * также сопоставляет каталоги и вызывает ошибку
  • для каждого совпадения, grep выводит fileName:n, n - количество найденных совпадений
  • тогда Awk учат читать второе поле каждой строки ('$ 2'), а если оно больше 3 (часть $2 > 3), отображать имя файла, которое является первым полем строки ( т.е. $1)
  • часть -F':' инструктирует awk, что такое разделитель полей
1 голос
/ 24 мая 2019

Использование GNU awk:

$ awk '(FNR==1){c=3}/^>/{c--}!c{print FILENAME; nextfile}' * 

Это не обработает полный файл, но достаточно, чтобы определить, имеет ли файл fasta 3 или более последовательностей:

  • Каждый раз, когда мы вводим новый файл, номер записи файла FNR сбрасывается в 1. Если это происходит, мы сбрасываем счетчик c в 3.
  • Каждый раз, когда мы видим строку, начинающуюся с >, мы уменьшаем счетчик
  • Если мы столкнулись с последовательностями 3 (распознаваемыми c==0), мы печатаем FILENAME и переходим к следующему файлу.
0 голосов
/ 24 мая 2019

Вот Perl-однострочник по двум причинам: вопрос интересный; и этот вопрос побудил меня узнать больше о Perl!

perl -ne '++$count if /^>/; $count=0, close ARGV, print "$ARGV\n" if $count==3' *
  • perl -ne: не печатать строки во время их обработки; запустите следующий код
  • ++$count if /^>/; - считать строки, начинающиеся с >. $count начинается с неопределенного, и Perl ++ воспринимает это как 0.
  • $count=0 ... close ... print ... if $count==3: Как только мы увидим третью строку, начинающуюся с >, сбросьте $count и выполните close и print.
    • close ARGV: не обрабатывать больше строк в текущем файле
    • print "$ARGV\n": напечатать имя файла, который мы только что завершили обработку. $ARGV - имя текущего файла и не сбрасывается до тех пор, пока не пришло время обработать следующую строку. См. «Perl-подобный псевдокод» в разделе 1028 * *1029*.

Редактировать Кстати, Perl на самом деле поддерживает библиотеку FASTA в BioPerl и других модулях. См., Например, https://metacpan.org/search?q=FASTA.

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