对 bedtools getfasta BED 输入使用变量而不是文件?
Use a variable instead of a file for bedtools getfasta BED input?
我想在下面的命令中输入一个变量来代替文件,这可能吗?
我想使用程序 bedtools getfasta
生成一些 FASTA 文件。通常我会先使用下面的 awk
到 bedtools 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
。我希望通过将初始 awk
到 bedtools 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
命令中使用变量时,没有生成任何输出。有没有办法像文件一样读取变量?我尝试了以下方法,但仍然无法正常工作:
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
基本上,我可以使用变量代替文件作为命令的参数吗?
我希望这是有道理的
谢谢,
杰米
如果您查看 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 的末尾,任何需要能够在输入中搜索、多次读取、读取前检查其大小等的操作都将不起作用)。
我想在下面的命令中输入一个变量来代替文件,这可能吗?
我想使用程序 bedtools getfasta
生成一些 FASTA 文件。通常我会先使用下面的 awk
到 bedtools 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
。我希望通过将初始 awk
到 bedtools 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
命令中使用变量时,没有生成任何输出。有没有办法像文件一样读取变量?我尝试了以下方法,但仍然无法正常工作:
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
基本上,我可以使用变量代替文件作为命令的参数吗?
我希望这是有道理的
谢谢,
杰米
如果您查看 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 的末尾,任何需要能够在输入中搜索、多次读取、读取前检查其大小等的操作都将不起作用)。