0

私は、シェルスクリプトの経験がまったくないか、ほとんどないため、特に厄介なシェルプログラミングを行っています。次のテキストファイルがあります。サブセット 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 および 2 番目のセット 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 に答える