#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
команде, вывод не генерируется. Есть ли способ, чтобы переменная считывалась как файл? Я пробовал следующее, но оно все еще не работает:
bedtools getfasta -s -fi Infile.fasta -bed "${swapped}" -fo Outfile.fasta
bedtools getfasta -s -fi Infile.fasta -bed <(echo "${swapped}") -fo Outfile.fasta
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
. Приведенная выше ссылка содержит подробные сведения, но даже стандарт POSIXecho
содержит эту рекомендацию (см. Разделы «ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ» и «ОБОСНОВАНИЕ»).
Ответ №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, все, что должно бытьвозможность поиска во входных данных, чтения их несколько раз, проверки их размера перед чтением и т. Д. не будет работать).