【问题标题】:Loop awk math over all columns在所有列上循环 awk 数学
【发布时间】:2017-03-18 14:59:57
【问题描述】:

我有一个 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

此外,在尝试遍历所有列时,我无法按照我的意愿输出结果以覆盖原始文件,因为它会添加越来越多的内容并创建无限循环。上面我必须输出到不同的文件,但我想用结果覆盖原始文件。

【问题讨论】:

  • 你的预期输出是什么?
  • 哦,我会用预期的输出编辑循环的。单数第一列是正确的预期输出。
  • 第一个 awk 程序不会产生那个输出。
  • 对不起,我从错误的文件夹中复制粘贴了我对其进行的错误测试。已经尝试了 20 种不同的方法,结果感到困惑。现在应该是正确的。
  • 脚本、问题描述和示例输出不匹配?您是否忽略了除第一列之外的所有列的前两行(测试用例中的 60 和 70)。

标签: math awk


【解决方案1】:
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

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

【讨论】:

  • 你没有使用60和70,第二列前两个值?
  • 好吧,我确实要求提供预期的输出,所以这就是我解释问题的方式。
【解决方案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

【讨论】:

  • 谢谢!我的预期输出是错误的。天哪,我觉得我问的这个问题太乱了,但这真的很有帮助!格伦的回答也帮助我更好地理解了这一点。谢谢你们!
  • 我投了赞成票,但我没有足够的代表来遗憾地展示它:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多