awk for循环使用if else条件到数组

时间:2012-05-30 12:40:08

标签: arrays for-loop awk if-statement

我寻求你的帮助,使用if else条件为我的awk for循环存储awk返回值。

If  $3 == $7
then print $9 multiplied by $4
else print $4 multiplied by (2 minus $9)

到目前为止我的工作是:

awk '{if ($3 == $7) print $9*$4; else print $4*(2-$9);}' file >outfile

上述代码适用于第一个数据列($9)。但是,我想遍历从9到1547的所有列并返回包含返回值的数组。这应该很简单,但我似乎无法理解这里的一些基本概念。

到目前为止,我理解需要在实际函数之前声明循环次数:

  

awk'{for(i = 9; i< = NF; i ++)} END {if($ 3 == $ 7)print $ i * $ 4;否则打印$ 4 *(2- $ i);}'

然而,如何以及何时声明阵列超出了我(生物学家)。任何帮助都将受到高度赞赏。

示例:

输入(大文件......此处为第1-10栏):

  

rs2070501 22 A 0.0206 0.337855 rs2070501 G A 0.977 0.066

输出:

  

0.0210738

这里的else语句开始了($ 3 *(2- $ 9)

如何让awk打印9-Nth的数组,而不仅仅是第9列

1 个答案:

答案 0 :(得分:4)

试试这个。

awk '{
    for(i=9; i<=NF; ++i)
        printf "%s%f",
            (i==9 ? "" : " "),
            ($3 == $7 ? $i*$4 : $4*(2-$i));
    printf "\n"
}' filename

( test ? when : else )只是一个简写;如果测试为真,则评估?之后的内容,否则:之后的内容。因此它为第一个字段打印一个空分隔符,否则打印一个空格;并根据$3 == $7是否为真来选择如何计算字段的值。