如何在shell使用gawk计算大量列的均方根?

我有一个文件是2500列,我需要计算前2499列的均方根。能否直接用gawk进行计算?能的话有没有具体的脚本。

下面是我只有两列列数据时尝试的脚本,是可以成功运行的。

for (( k=0;k<=100;k++ ));do
    gawk -v dis1=${k} 'BEGIN{OFS="\t"}{if(($1<dis1)){count++;sum += $2*$2;}}END{if(count>0){avg=sqrt(sum/count);}else{count=0;avg=0;}print dis1,count,avg}' file1  >>file2
done

这是尝试的脚本,但脚本无法运行。

 for (( k=0;k<=100;k++ ));do
    gawk -v dis1=${k} 'BEGIN{OFS="\t"}{for(i=1;i<NF;i++){if(($NF<dis1)){count++;sum[i] += $i*$i;}}}END{if(count>0){avg[i]=sqrt((sum[i])/(count));}else{count=0;avg[i]=0;}print dis1,avg[i]}' file1 >>file2
done
阅读 724
avatarAI BotBETA

要在shell中使用gawk计算大量列的均方根,你可以使用关联数组来存储每列的求和与计数,然后计算均方根。你的第二个脚本有一些错误,我将帮你修复并提供一个正确的脚本。

以下是计算前2499列均方根的gawk脚本:

#!/bin/bash

# 假设你的输入文件是file1,输出文件是file2
input="file1"
output="file2"

# 使用gawk进行计算
gawk -v max_col=2499 '
BEGIN {
    OFS = "\t";
    for (i = 1; i <= max_col; i++) {
        sum[i] = 0;
        count[i] = 0;
    }
}
{
    for (i = 1; i <= max_col; i++) {
        # 假设不需要基于某个条件过滤行,只是计算均方根
        sum[i] += $i * $i;
        count[i]++;
    }
}
END {
    for (i = 1; i <= max_col; i++) {
        if (count[i] > 0) {
            avg = sqrt(sum[i] / count[i]);
        } else {
            avg = 0;
        }
        print i, avg;
    }
}' "$input" > "$output"

这个脚本做了以下几件事:

  1. BEGIN块中,它初始化了两个关联数组sumcount,用于存储每列的求和与计数。
  2. 在主处理块中,它遍历每一列,将每列的平方值加到sum数组中,并将计数加1。
  3. END块中,它遍历每列,计算均方根,并打印列号和对应的均方根值。

注意:这个脚本假设你不需要基于某个条件(如你的第一个脚本中的$1 < dis1)来过滤行。如果你的数据确实需要基于某个条件来过滤行,请相应地修改主处理块中的代码。

确保将上述脚本保存为文件(比如calculate_rms.sh),并给予执行权限(chmod +x calculate_rms.sh),然后你就可以通过命令行运行这个脚本来得到你想要的结果了。

另外,请确保你的输入文件file1存在,并且格式正确(即每行都有至少2499个由制表符或空格分隔的数值)。执行脚本后,结果将输出到file2中。

1 个回答
新手上路,请多包涵

试下这个脚本呢

for k in {0..100}; do  
    gawk -v dis1="$k" '  
    {  
        sum = 0  
        count = 0  
        for (i = 1; i < NF; i++) {  
            if ($i < dis1) {  
                sum += $i * $i  
                count++  
            }  
        }  
        if (count > 0) {  
            avg = sqrt(sum / count)  
        } else {  
            avg = 0  
        }  
        print dis1, avg  
    }  
    ' file1 >> file2  
done
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进