Bash传递不在循环第i个元素中的文件名

Bash传递不在循环第i个元素中的文件名,bash,for-loop,Bash,For Loop,在一个简单的文件处理过程中,如果要对目录中的每个文件执行某些操作,可以执行以下操作: for i in file1 file2 file3 file5 do echo "Processing $i" done FILES=/path/to/directory for i in $FILES do bedtools intersect -a $i -b file2 file3 file5 done 这里我要做的是将$I以及非$I文件作为参数传递给命令。假设我的目录包含4个文件(file1、fi

在一个简单的文件处理过程中,如果要对目录中的每个文件执行某些操作,可以执行以下操作:

for i in file1 file2 file3 file5
do
echo "Processing $i"
done
FILES=/path/to/directory
for i in $FILES
do
bedtools intersect -a $i -b file2 file3 file5
done
这里我要做的是将$I以及非$I文件作为参数传递给命令。假设我的目录包含4个文件(file1、file2、file3、file5)。例如,在处理file1时循环的第一次迭代中,我希望将其余文件(file2、file3、file5)传递给命令的-b参数

例如,bash中循环的第一次迭代应如下所示:

for i in file1 file2 file3 file5
do
echo "Processing $i"
done
FILES=/path/to/directory
for i in $FILES
do
bedtools intersect -a $i -b file2 file3 file5
done
第二次迭代中由于文件2位于$i中,其余文件将传递给
-b
参数

for i in $FILES
do
bedtools intersect -a $i -b file1 file3 file5
done
对于目录中的所有文件,依此类推。简而言之,将当前文件传递给
-a
参数,将其余文件传递给
-b
参数

for i in $FILES
do
bedtools intersect -a $i -b file1 file3 file5
done

如果有人能帮我,那就太好了。谢谢。

您只需使用数字循环并从数组中取出切片即可:

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
shopt-s nullglob
文件=(路径/到/目录/*)
对于((i=0;i<${#文件[@]};++i));做
file=${files[i]}
其他=(“${files[@]:0:i}”“${files[@]:i+1}”)
bedtools相交-a“$文件”-b“${others[@]}”
完成

这将循环遍历数组
文件的索引
,并在当前索引
i
之前和之后切片该部分,以获得
其他索引

,您也可以这样尝试

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

谢谢你的回答,我认为它没有正确地传递$other文件名。我得到了一个错误。我已经手动尝试过,当我按照以下方式操作时,它正在工作:
bedtools intersect-a file1.txt-b file2.txt file3.txt。。fileN.txt>output.txt
。你能不能加一条回音线,这样我就可以看到我传递给这些参数的是什么?谢谢。$others文件名应该用空格分隔。如果您在脚本中添加
set-x
,您将能够看到正在执行的命令。@Newbie“${others[@]}”将数组的每个元素作为单独的字(参数)展开。我使用了一个额外的东西,这可能是导致问题的原因。你能告诉我怎么做才对吗。要获取我的文件的第一个索引,请将其文件名在
上分离:
a=$(echo$file | cut-d“-uf 1)
,然后将输出保存为
bedtools intersect-a“$file”-b“${others[@}”>$a
这是错误的。任何类型的空白文件都会严重破坏您的代码!代码有严重错误:1)带有空格字符的文件名会破坏代码。2) 如果您没有使用数组的额外功能,请使用
“${files[@]}”
!3) 报价扩展:
文件+=(“$i”)
。4) 引用
unset
命令,否则它将进行路径名扩展。如果您的目录中有一个名为
fileso
的文件,它将破坏您的代码。另外,请注意,可以在数组的索引上循环。那么就不需要计数了。