Как выполнить множественное совпадение и напечатать разное количество строк после каждого шаблона с помощью awk

У меня есть большой файл с тысячами строк, который выглядит так:

>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00002235.4
TTACGCAT
TAGGCCAG
>ENST00005546.9
TTTATCGC
TTAGGGTAT

Я хочу использовать grep для определенных идентификаторов (после знака >), например, ENST00001234.1, а затем хочу получать строки после совпадения до следующего > [независимо от количества строк]. Я хочу получить таким образом около 63 идентификаторов одновременно.

Если я grep ENST00001234.1 и ENST00005546.9 ids, идеальный результат должен быть:

>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT

Я пробовал awk '/ENST00001234.1/ENST00005546.9/{print}', но это не помогло.


person Apex    schedule 10.09.2020    source источник
comment
Возможно, вас заинтересует приложение под названием bioawk, разработанное для этих целей поверх awk.   -  person Daemon Painter    schedule 10.09.2020


Ответы (3)


Вы можете установить > в качестве разделителя записей:

$ awk -F'\n' -v RS='>' -v ORS= '$1=="ENST00001234.1"{print RS $0}' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
  • -F'\n', чтобы упростить сравнение поискового запроса с первой строкой
  • -v RS='>' установить > как разделитель входных записей
  • -v ORS= очистите разделитель выходной записи, иначе вы получите лишнюю новую строку в выводе
  • $1=="ENST00001234.1" это приведет к сравнению строк и совпадению со всей первой строкой, в противном случае вам придется избегать метасимволов регулярных выражений, таких как ., и добавлять якоря
  • print RS $0 если совпадение найдено, выведите > и содержимое записи


Если вы хотите найти более одного условия поиска, поместите их в файл:

$ cat f1
ENST00001234.1
ENST00005546.9

$ awk 'BEGIN{FS="\n"; ORS=""}
       NR==FNR{a[$0]; next}
       $1 in a{print RS $0}' f1 RS='>' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT

Здесь содержимое f1 используется для построения ключей для массива a. После чтения первого файла RS='>' изменит разделитель записей для второго файла.

$1 in a проверит, соответствует ли первая строка ключу в массиве a

person Sundeep    schedule 10.09.2020

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

awk -v search="ENST00001234.1,ENST00002235.4" '
BEGIN{
  num=split(search,arr,",")
  for(i=1;i<=num;i++){
    look[">"arr[i]]
  }
}
/^>/{
  if($0 in look){ found=1  }
  else          { found="" }
}
found
' Input_file

Если вы хотите прочитать идентификаторы (которые необходимо найти в Input_file) из другого файла, попробуйте выполнить следующее. Где look_file - это файл, в котором есть все идентификаторы, которые необходимо найти, а Input_file - это фактический файл содержимого.

awk '
FNR==NR{
  look[">"$0]
}
/^>/{
  if($0 in look){ found=1  }
  else          { found="" }
}
found
' look_file  Input_file


Для одиночного текстового поиска: Не могли бы вы попробовать следующее. Написано и протестировано на показанных примерах в GNU awk. Можно указать строку, которую нужно искать в переменной search в соответствии с их требованиями.

awk -v search="ENST00001234.1" '
/^>/{
  if($0==">"search){  found=1  }
  else             {  found="" }
}
found
' Input_file

Объяснение: Добавление подробного объяснения вышеизложенного.

awk -v search="ENST00001234.1" '     ##Starting awk program from here and setting and setting search variable value what we need to look.
/^>/{                                ##Checking condition if a line starts from > then do following.
  if($0==">"search){  found=1  }     ##Checking condition if current line equals to > search(variable value) then set found to 1 here.
  else             {  found="" }     ##else set found to NULL here.
}
found                                ##Checking condition if found is SET then print that line.
' Input_file                         ##Mentioning Input_file name here.
person RavinderSingh13    schedule 10.09.2020

Нет необходимости изобретать велосипед. Для этой задачи существует несколько инструментов биоинформатики (извлечение fasta последовательностей с помощью списка идентификаторов последовательностей). Например, seqtk subseq:

Извлечь последовательности с именами в файле name.lst, по одному имени последовательности в строке:

seqtk subseq in.fq name.lst > out.fq

Он также работает с fasta файлами. Используйте conda install seqtk или conda create --name seqtk seqtk, чтобы установить пакет seqtk, который имеет другие полезные функции и работает очень быстро.

СМОТРИ ТАКЖЕ:

Получение последовательностей FASTA с использованием идентификаторов последовательностей
Извлечь последовательности fasta из файла, используя список в другом файле
Как извлечь последовательность из большого (6 ГБ) файла Multifasta?
извлечь последовательности из файла multifasta по идентификатору в файле с помощью awk

person Timur Shtatland    schedule 10.09.2020