Использовать переменную вместо файла для ввода bedtools getfasta BED?

#bash #variables #bedtools

#bash #переменные #bedtools

Вопрос:

Я хотел бы ввести переменную вместо файла в приведенной ниже команде, возможно ли это?

Я хотел бы сгенерировать несколько файлов FASTA с помощью программы bedtools getfasta . Обычно я бы сначала упорядочил входные файлы, используя awk bedtools sort команды to ниже. Затем вывод передается в выходной файл. Затем этот выходной файл будет следовать за -bed флагом, bedtools getfasta чтобы я мог создавать требуемые файлы FASTA, например

 awk '{if ($2>$3)print $1,$3,$2,".",".","-";else print $1,$2,$3,".","."," ";}' OFS='t' Infile.bed | 
awk '{a=$2-1;print $1,a,$3,$4,$5,$6;}' OFS='t' | 
bedtools sort > OrderedFile.bed


bedtools getfasta -s -fi Infile.fasta -bed OrderedFile.bed -fo Outfile.fasta
 

Тем не менее, у меня есть много файлов, для которых я хотел бы использовать bedtools getfasta . Я надеялся избежать создания дополнительных файлов OrderedFile.bed, установив вывод начальных awk bedtools sort команд в качестве переменной (см. Ниже)

 swapped=$(awk '{if ($2>$3)print $1,$3,$2,".",".","-";else print $1,$2,$3,".","."," ";}' OFS='t' Infile.bed | awk '{a=$2-1;print $1,a,$3,$4,$5,$6;}' OFS='t' | bedtools sort) 
 

Это работает довольно хорошо:

 echo "${swapped}"
HEADING_1   4   12  .   .    
HEADING_2   4   12  .   .   -
 

Когда я использую переменную в bedtools getfasta команде, вывод не генерируется. Есть ли способ, чтобы переменная считывалась как файл? Я пробовал следующее, но оно все еще не работает:

  1. bedtools getfasta -s -fi Infile.fasta -bed "${swapped}" -fo Outfile.fasta
  2. bedtools getfasta -s -fi Infile.fasta -bed <(echo "${swapped}") -fo Outfile.fasta
  3. bedtools getfasta -s -fi Infile.fasta -bed <(<<< "${swapped}") -fo Outfile.fasta

В принципе, могу ли я использовать переменную вместо файла в качестве аргумента для команды?

Я надеюсь, что это имеет смысл

Спасибо,

Джейми

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

1. Как насчет просто <<< «$swapped» ?

2. Второй вариант # 2 должен был работать нормально.

3. Второй должен был работать нормально, если бы программа могла читать из FIFO. Не все программы могут; иногда требуется поисковый FD (например, если они реализуют двухпроходный алгоритм и должны дважды прочитать входной файл).

4. Кстати, еще одна причина, по которой # 2 может завершиться неудачей, помимо требования к возможности поиска, заключается в том, что в современных версиях Python subprocess не передает дочерним элементам дескрипторы файлов, отличные от stdin, stdout и stderr, поэтому, если часть обработки выполняется отдельной командой, которая bedtools сама запускается, эта команда не обязательно сможетпрочитайте /dev/fd ссылку. Это также объясняет, почему -bed stdin используемый в наборе тестов работает, поскольку stdin является одним из трех FD, которые передаются по умолчанию.

5. Да, я определенно рекомендую printf вместо echo . Приведенная выше ссылка содержит подробные сведения, но даже стандарт POSIX echo содержит эту рекомендацию (см. Разделы «ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ» и «ОБОСНОВАНИЕ»).

Ответ №1:

Если вы посмотрите в наборе тестов для команды bedtools getfasta , вы увидите, что она передает слово stdin в качестве имени файла, когда хочет, чтобы ввод BED считывался из stdin. Например:

 LINES=$(echo $'chr1t1t10' | $BT getfasta -fi t.fa -bed stdin -fo - | awk 'END{ print NR }')
 

Итак, нам просто нужно сделать то же самое в вашем скрипте:

 bedtools getfasta -s -fi Infile.fasta -bed stdin -fo Outfile.fasta <<<"$swapped"
 

Кстати, в большинстве случаев ваша вторая попытка сработала бы:

 bedtools getfasta -s -fi Infile.fasta -bed <(echo "${swapped}") -fo Outfile.fasta
 

… поскольку <(...) выражение заменяется именем файла, из которого можно прочитать выходные данные. (Есть несколько предостережений: обычно он передается по /dev/fd ссылке, поэтому любая программа, которая закрывает файловые дескрипторы, отличные от стандартных stdin, stdout и stderr по умолчанию, не сможет читать содержимое, заданное таким образом; кроме того, поскольку это имя файла является концом FIFO, все, что должно бытьвозможность поиска во входных данных, чтения их несколько раз, проверки их размера перед чтением и т. Д. не будет работать).