我尝试使用bash迭代两个数组(有两个嵌套的for循环)。 通过迭代大型数组,不幸的是bash真的很慢。所以我尝试使用awk。
第一
我正在阅读两个文件(大约200.000行)并使用我想要使用的标签分隔列
START=($(awk -F'\t' '{print $5}' $inputGenes))
我一直认为START现在就像一个数组,但是现在我不再确定了。 我有很多不同的“阵列”,然后进入下一步
第二
一切都可以正常使用小文件而不是使用awk,而是使用普通的嵌套bash循环。 现在我试图使用awk但我失败了。 两个变量$ len和$ varlen指示两个数组的大小(在使用awk之前读入)
len=${#posVCF[@]}
循环正在运行但我没有输出,因为无法从数组中获取信息:$ posVCF [$ i]什么都不返回。但我不知道如何从我的数组变量中获取信息。
**echo | awk 'BEGIN {for(i=1; i -st $len; i++) {
for (j=1; j -st $varlen; j++) {
if ($posVCF[$i] -gt $START[$j] && $posVCF[$i] -st $END[$j]) {
print $posVCF[$i] " > " $START[$j] " und < " $END[$j]
}
}
}
}'**
我通过阅读文件做错了什么或者你有任何想法吗?我真的很喜欢用bash编程,但我必须用bash编写。 我希望你能帮助我,非常感谢你。
答案 0 :(得分:0)
您需要大括号来取消引用数组元素。不是$posVCF[$i]
,而是${posVCF[$i]}
是正确的。
我误解了你的问题。为什么你认为你需要awk?你的所有变量都在shell中。您可以使用类似C的for loops in bash:
for ((i=1; i < len; i++)); do
for ((j=1; j < varlen; j++)); do
if (( ${posVCF[$i]} > ${START[$j]} && ${posVCF[$i]} < ${END[$j]} )); then
echo ${posVCF[$i]} " > " ${START[$j]} " und < " ${END[$j]}
fi
done
done
这是使用bash算术评估语法:(( ... ))