我正在尝试做一个(bedtools)intersect。有人看到我的bash代码有什么问题吗?
#!/bin/bash
dir=$(pwd)
query=$dir/query_beds
pgs=$dir/pgs_beds
for file in $query/*; do
bedtools intersect -wa -wb -a $file -b $pgs/* -c -C -sorted -filenames
done > ${file%.*}-results.txt
“query”目录包含许多文件,每个文件都需要使用bedtools包和命令intersect针对“pgs”目录中的许多文件进行迭代查询,命令intersect允许文件“-b”使用星号循环多个文件。
每次使用:
One or more BAM/BED/GFF/VCF file(s) “B”. Use “stdin” if passing B with a UNIX pipe.
NEW!!!: -b may be followed with multiple databases and/or wildcard (*) character(s).
我认为问题出在$pgs/* 上,在另一个目录中对多个文件循环一个文件,我可能需要重新构造循环以更改目录或其他内容。
最新消息:
我已经更新了脚本,并能够让一切工作:
#!/bin/bash -x
dir=$(pwd)
query=$dir/query_beds
pgs=$dir/pgs_beds
for f in $(ls $query/*.bed); do
for g in $(ls $pgs/*); do
bedtools intersect -wa -wb -a $f -b $g* -C -filenames
done > $(basename $f .ext).txt
done
1条答案
按热度按时间7lrncoxx1#
在你的代码中,整个循环的输出被重定向到一个文件中。也许你需要类似下面的内容(将每个bedtool的输出重定向到一个单独的文件中)。
另外请注意,如果您使用
${file%.*}
,输出将在$query
目录中创建,因此执行脚本两次可能会导致意外结果。我建议使用$(basename $file .ext).txt
(其中.ext是$query
中文件的扩展名。basename命令只保留文件名(因此没有目录),如果存在.ext,也会将其删除。