Использование Grep для поиска шаблонов в многофайловых строках

#linux #grep

#linux #grep

Вопрос:

Я работаю в области биоинформатики, и мне нужно подсчитывать шаблоны, такие как GATTACCA, в больших файлах, которые выглядят примерно так:
«ATTTCCCGATCCGAG GATT (/ n)
ACCA CGTAGATGATACACGT (etc)» Есть ли способ заставить Grep игнорировать символ новой строки /n? Спасибо за любую помощь!

Комментарии:

1. вам просто нужно количество GATTnACCA вхождений? и насколько велик файл?

2. Насколько велики файлы? Во-вторых — grep распознает по новой строке, поэтому не может ее сопоставить. Но вы можете использовать «tr» для замены символа новой строки пробелом, но опять же, насколько велики файлы?

Ответ №1:

Я думаю, это может сделать то, что вы хотите:

 tr -d 'n' < file | grep -o GATTACCA
 

Он (временно) удаляет переводы строк из вашего файла (используя tr и его -d опцию для удаления) перед передачей в grep .

Комментарии:

1. Спасибо! пока это работает проще всего … сейчас… Есть идеи, как разобрать его на python? Я знаю, как использовать простые команды Linux в python, но не знаю, как передавать…

Ответ №2:

Использование sed и grep :

 sed -n 'H;x;s/n//g;/GATTACCA/p' input | grep -o GATTACCA
 

Комментарии:

1. Почему grep ? Ваша sed команда уже выполняет свою работу. Я что-то упускаю?

2. шаблон может встречаться несколько раз.

Ответ №3:

Вы можете сделать это с помощью awk и grep, чтобы подсчитать количество вхождений слова GATTACCA в ваш файл,

 awk -v RS="" '{gsub (/n/,""); print}' file | grep -o 'GATTACCA' | wc -l
 

Объяснение:

 RS=""            #  Turns the input file into a single record.

gsub (/n/,"")     #  Removes all the n character.

grep -o 'GATTACCA' # From the awk output, it fetches the string GATTACCA and prints every match in a new line.

wc -l              #   To count the number of lines
 

Комментарии:

1. Вы можете использовать grep -c для подсчета вместо wc .

2. @terdon он отображает другой результат.

3. Мне нужно количество вхождений, а не количество строк… так что -c, вероятно, было бы лучше?

4. Он отображает количество вхождений. вы пробовали это? Вы можете проверить выходной mycode с другими.

Ответ №4:

У вас уже есть два хороших общих ответа. Другой подход заключается в использовании sed :

 perl -pe 's/n//' file | grep -o GATACA
 

Однако, если вы работаете с файлами fasta, это может быть интересно:

 #! /bin/sh
gawk '{
        if (substr($1,1,1)==">")
        if (NR>1)
                    printf "n%st", substr($0,2,length($0)-1)
        else 
            printf "%st", substr($0,2,length($0)-1)
        else 
                printf "%s", $0
}END{printf "n"}'  "$@"
 

Приведенный выше сценарий изменяет формат fasta на tbl (seq IDsequence, все в одной строке). Я очень часто использую его для grepping:

 FastaToTbl foo.fa | grep GATTACA 
 

У меня также есть TblToFasta для восстановления оригинала:

 #! /bin/sh
# tbl-to-fasta.awk transforms a tbl file into a fasta file, 60 columns per record
# usage=gawk -f tbl-to-fasta TBL_FILE 


gawk '{
  sequence=$NF

  ls = length(sequence)
  is = 1
  fld  = 1

  while (fld < NF)
  {
     if (fld == 1){printf ">"}
     printf "%s " , $fld

     if (fld == NF-1)
      {
        printf "n"
      }
      fld = fld 1
  }

  while (is <= ls)
  {
    printf "%sn", substr(sequence,is,60)
    is=is 60
  }
}' "$@"