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

问题描述 投票:2回答:3

在简单的文件处理中,您希望在目录中的每个文件上执行某些操作,您可以执行以下操作:

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参数。

如果有人可以帮助我,那将是很棒的。谢谢。

bash for-loop
3个回答
2
投票

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

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


0
投票

你也可以尝试这样的,

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

0
投票
count=0; files=(*)
for i in ${files[*]}; do 
   unset files[count]
   echo "bedtools intersect -a $i -b ${files[*]}"
   files+=($i)
   ((count++))
done
© www.soinside.com 2019 - 2024. All rights reserved.