0

我有特别讨厌的 shell 编程,但在 shell 脚本方面几乎没有经验。我有以下文本文件。我需要做的是计算子集 1 的平均 Y(m) 和子集 2 的平均 Y(m) 之间的差异。可以有两个以上的子集,但计算子集之间的差异就足够了1 和子集 2。

我尝试了各种 awk 命令,但似乎我的大脑被太多的障碍所煎熬。啊!

MODEL PARAMETERS :
Project : Report
Dataset : xxx

Number of subsets    : 2
Total number         : 8

Subset number    : 1
Subset name      : xxx_sub1
Number           : 4

 NR   TYPE                       X(m)      Y(m)    Z(m)   Volume Pressure   CluNo     Activ  Group
 ---  ---------------------    ------    ------   -----  ------- --------   -----     -----  ------
   1  Type text                  0.00    -10.40    9.00   2000.0    500.0       0     0     1
   2  Type text                  0.00     -9.60    9.00   1000.0    500.0       0     1     1
   3  Type text                  3.00    -10.40    9.00   1200.0    500.0       1     1     1
   4  Type text                  3.00     -9.60    9.00    800.0    500.0       1     1     1

Subset number    : 2
Subset name      : xxx_sub2
Number           : 4

 NR   TYPE                       X(m)      Y(m)    Z(m)   Volume Pressure   CluNo Activ  Group
 ---  ---------------------    ------    ------   -----  ------- --------   ----- -----  ------
   1  Type text                  0.00     10.40   15.00   2000.0    500.0       0         0     1
   2  Type text                  0.00      9.60   15.00   1000.0    500.0       0     1     1
   3  Type text                  3.00     10.40   15.00   1200.0    500.0       1     1     1
   4  Type text                  3.00      9.60   15.00    800.0    500.0       1     1     1

Units : 
   Coordinates      : meter
   Volume           : cubic cm
   Pressure         : pascal

基本上我需要第一组 Y(m) 值的平均值: (-10.4-9.6-10.4-9.6)/4 = -10m 和第二组 Y(m) 值的平均值,即 (10.4+9.6+10.4 +9.6)/4= 10m 并计算两个平均值之间的差异,即 20m。

4

2 回答 2

4

可以用这个脚本来完成(用 GNU Awk 测试,在上面的输入上):

#!/bin/bash

gawk -- '
    BEGIN {
        s = 0
        r = 0
    }

    /^Subset number/ {
        s = $4
        r = 0
    }

    /Type text/ {
        subset[s][r] = $5
        r++
    }

    END {
        for (s in subset) {
            subset_average[s] = 0
            for (r in subset[s]) {
                subset_average[s] += subset[s][r]
            }
            subset_average[s] /= length(subset[s])
        }
        print subset_average[2] - subset_average[1]
    }
'

通过修改 END 块,它也可以适应更多的子集。

如果“键入文本”只是您示例中真实数据的替换,那么数据行可能会以其他方式匹配。通过匹配行首的数字来表示,可能前面有空格。

于 2013-09-24T11:24:51.367 回答
2

鉴于您的结构化文件,拾取Y(m)列并将它们求和非常容易。每个总和都存储在数组a中,其中键是Subset number

$ awk 'NR>1{for(i=1;i<=$9;i++)a[$2]+=$(23+i*10+i);a[$2]/=$9}END{print a[2]-a[1]"m"}' RS='Subset number' file
20m

END对于两个子集,只需打印块中两者之间的差异,a[1]-a[2]即子集1的总和减去子集的总和2。对于更多子集,只需遍历每个键并执行所需的计算。

于 2013-09-24T10:51:34.837 回答