在简单的文件处理中,您希望在目录中的每个文件上执行某些操作,您可以执行以下操作:
for i in file1 file2 file3 file5
do
echo "Processing $i"
done
我想在这里做的是传递$ i以及非$ i文件作为命令的参数。让我们说我的目录包含4个文件(file1,file2,file3,file5)。例如,在处理file1的循环的第一次迭代中,我想将其余文件(file2,file3,file5)传递给命令的-b参数。
例如,bash中循环的第一次迭代应该如下所示:
FILES=/path/to/directory
for i in $FILES
do
bedtools intersect -a $i -b file2 file3 file5
done
在第二次迭代中,当file2在$ i中时,其余文件将被传递给-b
参数。
for i in $FILES
do
bedtools intersect -a $i -b file1 file3 file5
done
等等,用于目录中的所有文件。简而言之,将当前文件传递给-a
参数,其余文件传递给-b
参数。
如果有人可以帮助我,那将是很棒的。谢谢。
您可以使用数字循环并从数组中取出切片:
shopt -s nullglob
files=( path/to/directory/* )
for (( i = 0; i < ${#files[@]}; ++i )); do
file=${files[i]}
others=( "${files[@]:0:i}" "${files[@]:i+1}" )
bedtools intersect -a "$file" -b "${others[@]}"
done
这循环通过数组files
的索引并切割当前索引i
之前和之后的部分以获得others
。
你也可以尝试这样的,
op=$(find /path/to/directory ! -iname ".*")
temp=$op
for i in $op;
do
rfile=${temp//$i/}
rfile=$(echo $rfile | tr '\n' ' ')
bedtools intersect -a $i -b $rfile
done
count=0; files=(*)
for i in ${files[*]}; do
unset files[count]
echo "bedtools intersect -a $i -b ${files[*]}"
files+=($i)
((count++))
done