【问题标题】:Compute standard deviationfor each row in awk计算 awk 中每一行的标准差
【发布时间】:2026-01-29 01:10:02
【问题描述】:

我有问题。我的数据由每行(500 列)中的 500 个字段组成,我也有 5000 行。我想计算每条线的标准偏差作为输出 输入示例

3  0  2  ...(496 another values)...   1
4  1  0  ...(496 another values)...   4
1  3  0  ...(496 another values)...   2

预期输出

0.571 (std for values from the first row)
0.186 (std values from the second row)
0.612 (std values from the third row)

我发现了类似的东西,但它不适合我的情况(他们为每列计算标准)。 Compute average and standard deviation with awk

我考虑计算每行的总和以检查平均值,然后为每个字段 std[i] += ($i - sum[i])^2,最后是 sqrt(std[i]/( 500-1)),但是我必须为每一行创建数组(5000 个数组)。

也许我应该将行更改为列,将列更改为行?

编辑:

是的,这太棒了

#!/bin/bash
awk 'function std1() { 
    s=0; t=0;
    for( i=1; i<=NF; i++)
        s += $i;
    mean = s / NF; 
    for (i=1; i<=NF; i++ )
        t += (mean-$i)*(mean-$i);
    return sqrt(t / s)
    }
    { print std1()}' data.txt >> std.txt

【问题讨论】:

  • 目前尚不清楚为什么需要多个数组,因为从问题描述看来,只要进入第 2 行,您就可以放弃第 1 行的所有工作。 ' 甚至不需要任何额外的数组,因为 awk 已经在 $1 .. $NF 中为您提供了这些字段。
  • 完全可以使用for (i = 1; i &lt;= NF; i++) // use $i here 对字段进行迭代,而无需创建数组。

标签: awk data-processing


【解决方案1】:

我不会保证计算,但你可以这样做:

awk 'function sigma(   s,   t) { 
    for( i=1; i<=NF; i++)
        s += $i;
    mean = s / NF; 
    for (i=1; i<=NF; i++ )
        t += (mean-$i)*(mean-$i);
    return sqrt(t / NF)
    }
    { print sigma()}' input-path

【讨论】:

  • 为什么计算了平均值但没有使用?应该是mean-$1
  • @mhawke 谢谢!正是我拒绝为计算做担保的原因!
  • 另外,将变量 s 和 t 初始化为 0 可能是个好主意,因为它们在每次迭代中都会被重用。或者您可以在 arg 列表中将它们声明为“本地”。
  • 非常感谢。 @mhawke 我将编辑后的脚本放入带有初始化变量的问题中,现在应该没问题了
  • @Mark:我刚刚做了另一项您可能没有注意到的更改:结果应该除以数据点的数量 (NF),而不是它们的总和。