如何在bash中同时重复两个for循环?
我试图执行一个需要两个输入文件的命令,这两个文件都是特定于每个示例的。我的解决方案是使用两个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循
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'每对都有变化),但我很难看到如何实现这一点。