Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中同时重复两个for循环?_Bash_Loops_For Loop - Fatal编程技术网

如何在bash中同时重复两个for循环?

如何在bash中同时重复两个for循环?,bash,loops,for-loop,Bash,Loops,For Loop,我试图执行一个需要两个输入文件的命令,这两个文件都是特定于每个示例的。我的解决方案是使用两个for循环: FILES=testgroup/*split.bam TARGETS=testgroup/*intervals for f in $FILES do for t in $TARGETS do IndelRealigner -Input1 $f Input2 $t Output $f.realigned.bam done done 但是当我在第二个for循环($t)上执行这个bash循

我试图执行一个需要两个输入文件的命令,这两个文件都是特定于每个示例的。我的解决方案是使用两个for循环:

FILES=testgroup/*split.bam
TARGETS=testgroup/*intervals

for f in $FILES
do
for t in $TARGETS
do

IndelRealigner -Input1 $f Input2 $t Output $f.realigned.bam

done
done
但是当我在第二个for循环($t)上执行这个bash循环时,第一个循环是常量,然后重复这个循环

我需要同时循环输入(即$f Sample1和$t Sample1、$f Sample2和$t Sample2)

谢谢你的帮助

编辑:

示例示例示例名称和关联的输入文件:

D8.1.112.fastqAligned.out.sam.rg_添加_sorted.bam.dedup.bam.split.bam D8.1.112.fastqAligned.out.sam.rg_添加了_sorted.bam.dedup.bam.split.bam.interval

同时,我将这两组文件移动到一个新目录中,看看是否可以在一个数组中指定两个组?但是我不知道该怎么做。到目前为止:

files=testgroup/newdir    

for f in $files
do
   for t in $files
   do
   IndelRealigner -Input1 $f Input2 $t Output $f.realigned.bam
   done
done

任何进一步的帮助都将不胜感激

您已经编写了一个嵌套循环,它的行为与它应该的完全一样:内部循环为外部循环的每个迭代执行。但您需要的是在一个过程中处理两组相关文件-您需要在一个循环中以某种方式进行处理

试着这样做:不要试图循环使用
f
t
,而是找出每对文件共有的
x。循环该
x
,并从循环中的
x
计算
f
t

您可能知道哪个文件
f
与哪个文件
t
一起,但脚本不知道。相关的
f
t
文件是否具有相同的前缀?然后,您需要遍历前缀列表。他们编号了吗?然后你需要一个数字循环。它仅仅是一个位置的东西(第一个
f
与第一个
t
一起出现)?在这种情况下,您是否对列表进行排序很重要


如果没有更多的信息,我们只能在一般意义上为您提供帮助。

您已经编写了一个嵌套循环,它的行为与它应该做的完全一样:外部循环的每次迭代都会执行内部循环。但您需要的是在一个过程中处理两组相关文件-您需要在一个循环中以某种方式进行处理

试着这样做:不要试图循环使用
f
t
,而是找出每对文件共有的
x。循环该
x
,并从循环中的
x
计算
f
t

您可能知道哪个文件
f
与哪个文件
t
一起,但脚本不知道。相关的
f
t
文件是否具有相同的前缀?然后,您需要遍历前缀列表。他们编号了吗?然后你需要一个数字循环。它仅仅是一个位置的东西(第一个
f
与第一个
t
一起出现)?在这种情况下,您是否对列表进行排序很重要


如果没有更多的信息,我们只能在一般情况下为您提供帮助。

一种可能的解决方案:首先将文件和目标读入数组。然后使用一个循环同时迭代两个数组:

#!/bin/bash
files=($(ls testgroup/*split.bam))
targets=($(ls testgroup/*intervals))
len=${#files[@]}
for ((i=0;i<$len;i++))
do
  IndelRealigner -Input1 "${files[$i]}" Input2 "${targets[$i]}" Output "${files[$i]}".realigned.bam
done
#/bin/bash
文件=($(ls testgroup/*split.bam))
目标=($(ls testgroup/*间隔))
len=${#文件[@]}

对于((i=0;i一种可能的解决方案:首先将文件和目标读入数组。然后使用一个循环同时迭代两个数组:

#!/bin/bash
files=($(ls testgroup/*split.bam))
targets=($(ls testgroup/*intervals))
len=${#files[@]}
for ((i=0;i<$len;i++))
do
  IndelRealigner -Input1 "${files[$i]}" Input2 "${targets[$i]}" Output "${files[$i]}".realigned.bam
done
!/bin/bash
文件=($(ls testgroup/*split.bam))
目标=($(ls testgroup/*间隔))
len=${#文件[@]}

对于((i=0;i只需在第一组文件上循环,并在运行时导出相应文件的名称:

for f in *bam; do
    IndelRealigner -Input1 "$f" -Input2 "${f}.intervals" -Output "$f.realigned.bam"
done

只需在第一组文件上循环,并在运行时导出相应文件的名称:

for f in *bam; do
    IndelRealigner -Input1 "$f" -Input2 "${f}.intervals" -Output "$f.realigned.bam"
done

您已经在循环中编写了一个循环。缩进您的代码,这可能会更清楚。Loop1-iteration1将运行Loop2的所有迭代。Loop1-iteration2也是如此。您必须在
文件
目标
之间建立某种关系,以便您可以在一个循环中执行此操作。仔细想想,您可以手动解决此问题并将其应用到代码中。也许共享一些示例文件/目标名称,也许我们可以帮助找出这种模式/关系。此外……避免使用所有大写字母命名变量,因为大写字母变量是为系统保留的。谢谢你的建议,我已经更新了我的帖子。你已经在循环中编写了一个循环。缩进你的代码,然后这可能更清楚。Loop1-iteration1将运行Loop2的所有迭代。Loop1-iteration2也是如此。您必须在
文件
目标
之间建立某种关系,这样您就可以在一个循环中完成此操作。仔细想想,您可以手动解决此问题并将其应用于代码。也许可以共享一些示例文件/目标名称,也许我们可以帮助找出这种模式/关系。另外……避免将变量命名为所有大写,因为大写变量是为系统保留的。谢谢你的建议,我已经更新了我的帖子。谢谢,但我无法使它工作。我无法真正确定错误,但返回的错误消息建议告诉我它正在尝试同时输入所有“input 1”文件。你是对的。脚本有点问题。我已修复。请重试。:-)谢谢,但我无法让它工作。我无法确定到底是哪里出了问题,但返回的错误消息向我表明它正在尝试同时输入所有“input 1”文件。你是对的。脚本有点问题。我已修复。请重试。:-)谢谢帮助。我已更新了帖子。输入文件确实有一个通用前缀('D8.1.112'每对都有变化)但我很难看到如何实现这一点。谢谢你的帮助。我已经更新了我的帖子。输入文件确实有一个通用前缀('D8.1.112'每对都有变化),但我很难看到如何实现这一点。