当前位置: 首页 > 知识库问答 >
问题:

文本处理 - 如何在shell使用gawk计算大量列的均方根?

谢俊英
2024-06-06

我有一个文件是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  >>file2done

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

 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 >>file2done

共有1个答案

孔棋
2024-06-06

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

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

#!/bin/bash# 假设你的输入文件是file1,输出文件是file2input="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中。

 类似资料:
  • 问题内容: 任何人都知道如何计算这些列之一的平均值(在Linux上)? 例如:mean(第2栏) 问题答案: Awk: 读为: 对于每一行,将第2列添加到变量“总计”中。 在文件末尾,打印“总计”除以记录数。

  • 我有一个简短的问题 我有一个数据帧,有许多测量列。我想计算具有相同(标题)名称的列的平均值。我使用下面的代码(在stackoverflow中找到)。。 如何计算数据帧中具有相同列名的列的平均值 作为示例数据... 结果是这样的。。。 这段代码告诉我具有相同(标题)名称的列的含义。 但是我也想要均方差。我试着用rowSds替换rowMeans,但是不起作用。 知道如何使用相同的代码来计算均方差吗??

  • 本文向大家介绍Shell文本处理三剑客之sed的使用,包括了Shell文本处理三剑客之sed的使用的使用技巧和注意事项,需要的朋友参考一下 sed 是 stream editor 的缩写,流编辑器,主要用于对标准输出或文件进行处理。 语法: 常用选项(option) 匹配模式(pattern) 匹配模式 说明 10command 第 10 行 10,20command 第 10 到 20 行 10

  • 问题内容: 我正在使用Hadoop示例程序WordCount处理大量的小文件/网页(大约2-3 kB)。由于这与hadoop文件的最佳文件大小相去甚远,因此该程序非常慢。我猜这是因为安置和撕毁工作的成本远远高于工作本身。这样的小文件还会导致文件名的命名空间耗尽。 我读到在这种情况下,我应该使用HDFS存档(HAR),但是我不确定如何修改此程序WordCount以从此存档中读取。程序可以在不进行修改

  • 我如何纠正这一点?

  • 本文向大家介绍Python文本处理之按行处理大文件的方法,包括了Python文本处理之按行处理大文件的方法的使用技巧和注意事项,需要的朋友参考一下 以行的形式读出一个文件最简单的方式是使用文件对象的readline()、readlines()和xreadlines()方法。 Python2.2+为这种频繁的操作提供了一个简化的语法——让文件对象自身在行上高效迭代(这种迭代是严格的向前的)。 为了读

  • 我遵循了此处提出的计算循环数据平均值的建议: https://en.wikipedia.org/wiki/Mean_of_circular_quantities 但是我也想计算均方差。 上面给出了平均值,但我不知道如何计算SD 我试着只取正弦和余弦的标准偏差的平均值,但我得到了不同的答案。

  • 问题内容: 我需要做类似的事情: 除了,我还需要检索的前20个值的移动平均值。 首选标准SQL,但如有必要,我将使用MySQL扩展。 问题答案: 这只是我的头顶,而且我正要出门,所以未经测试。我也无法想象它会在任何种类的大数据集上表现出色。我确实确认它至少可以正常运行。:)