0

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

我想使用该程序生成一些 FASTA 文件bedtools getfasta。通常我会先使用下面的awktobedtools sort命令来订购输入文件。然后将输出通过管道传输到输出文件中。然后这个输出文件将跟随-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 getfastaawk我希望通过将初始命令的输出设置为变量来避免创建额外的 OrderedFile.bed 文件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

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

我希望这是有道理的

谢谢,

杰米

4

1 回答 1

2

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

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链接传递的,因此任何关闭默认 stdin、stdout 和 stderr 以外的文件描述符的程序都无法以这种方式读取内容;此外,只要该文件名是FIFO 的结尾,任何需要能够在输入中四处寻找,多次读取,读取前检查其大小等的东西都不起作用)。

于 2020-12-17T16:20:43.093 回答