对 bedtools getfasta BED 输入使用变量而不是文件?

Use a variable instead of a file for bedtools getfasta BED input?

我想在下面的命令中输入一个变量来代替文件,这可能吗?

我想使用程序 bedtools getfasta 生成一些 FASTA 文件。通常我会先使用下面的 awkbedtools sort 命令对输入文件进行排序。然后将输出通过管道传输到输出文件中。然后,此输出文件将遵循 bedtools getfasta 中的 -bed 标志,因此我可以创建我需要的 FASTA 文件,例如

awk '{if (>)print ,,,".",".","-";else print ,,,".",".","+";}' OFS='\t' Infile.bed | 
awk '{a=-1;print ,a,,,,;}' OFS='\t' | 
bedtools sort > OrderedFile.bed


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

但是,我有很多文件想用 bedtools getfasta。我希望通过将初始 awkbedtools sort 命令的输出设置为变量来避免创建额外的 OrderedFile.bed 文件(见下文)

swapped=$(awk '{if (>)print ,,,".",".","-";else print ,,,".",".","+";}' OFS='\t' Infile.bed | awk '{a=-1;print ,a,,,,;}' 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

基本上,我可以使用变量代替文件作为命令的参数吗?

我希望这是有道理的

谢谢,

杰米

如果您查看 bedtools getfasta 命令的测试套件,您会看到它在希望从标准输入读取 BED 输入时将单词 stdin 作为文件名传递.例如:

LINES=$(echo $'chr1\t1\t10' | $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 link 传递,因此任何关闭文件描述符的程序,而不是默认的 stdin、stdout 和 stderr 将无法读取内容; 此外,只要该文件名是 FIFO 的末尾,任何需要能够在输入中搜索、多次读取、读取前检查其大小等的操作都将不起作用)。