在所有列上循环awk数学

时间:2016-11-04 17:17:01

标签: math awk

我有一个awk脚本,我对文件进行一些算术运算,并希望将等式循环到文件中的所有列。当我将方程应用于单个列时,它可以工作,但是我尝试循环它失败并且错误地输出结果并且全部输入到同一列中(我希望将它们保存在单独的列中)。我的奇异柱方程是:

#!/bin/awk -f

BEGIN {
}
{

    if(NR == 1) {
           blank = $1
       }
    if(NR == 2) {
           zero = $1
       }
    base = zero - blank;

    if(NR > 3) {

    print (($1 - blank)/base) >> "data.txt"

    }


}
END {
}

输入:

10
20
30
40
50

输出

2
3
4

我尝试多列:

#!/bin/awk -f

BEGIN {
}
{
    for(i = 1; i <= NF; i++) {
    if(NR == 1) {
           blank = $i
       }
    if(NR == 2) {
           zero = $i
       }
    base = zero - blank;

    if(NR > 3) {

       print (($i - blank)/base) >> "data.txt"

    }
    }

}
END {
}

输入:

10 60
20 70
30 80
40 90
50 100

输出:

-2
3
-1
4

预期产出:

2 2
3 3
4 4

此外,尝试遍历所有列时,我无法输出结果以覆盖原始文件,因为它会添加越来越多并创建无限循环。上面我不得不输出到另一个文件,但我想用结果覆盖原始文件。

2 个答案:

答案 0 :(得分:2)

如果您的测试用例输出错误,可能就是您要查找的内容(每列的公式相同):

$ awk 'NR==1{split($0,b);next} 
       NR==2{split($0,z);next} 
            {for(i=1;i<=NF;i++) printf "%s", ($i-b[i])/(z[i]-b[i]) OFS; 
             print ""}' file

会给你

2 2
3 3
4 4

答案 1 :(得分:0)

seq 10 10 100 | pr -2Ts" " | awk '
    NR == 1 {blank = $1} 
    NR == 2 {zero = $1} 
    NR >= 3 {
        for (i=1; i<=NF; i++) 
            $i = ($i - blank) / (zero - blank)
        print 
    }
'
2 7
3 8
4 9

您需要注意在那些奇怪命名的变量中需要捕获哪个字段。