使用awk读取文件并使用嵌套循环迭代数组

时间:2014-04-29 11:19:07

标签: arrays bash awk

我尝试使用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编写。 我希望你能帮助我,非常感谢你。

1 个答案:

答案 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算术评估语法:(( ... ))