unix bash循环一个文件夹中的文件与另一个文件夹中的所有文件

8dtrkrch  于 2022-11-29  发布在  Unix
关注(0)|答案(1)|浏览(204)

我正在尝试做一个(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
7lrncoxx

7lrncoxx1#

在你的代码中,整个循环的输出被重定向到一个文件中。也许你需要类似下面的内容(将每个bedtool的输出重定向到一个单独的文件中)。
另外请注意,如果您使用${file%.*},输出将在$query目录中创建,因此执行脚本两次可能会导致意外结果。我建议使用$(basename $file .ext).txt(其中.ext是$query中文件的扩展名。basename命令只保留文件名(因此没有目录),如果存在.ext,也会将其删除。

#!/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 > ${file%.*}-results.txt
done

相关问题