3

たとえば、次のようなデータがあります。

Flats 2b 
01/1991, 3.45
01/1992, 4.56
01/1993, 4.21
01/1994, 5.21
01/1995, 7.09
01/2013, 6.80
Eagle 2
01/1991, 4.22
01/1992, 6.32
01/1993, 5.21
01/1994, 8.09
01/1995, 7.92
01/2013, 6.33

希望する出力が次のようになるように、列 2 の平均を計算しようとしています。

Flats 2b
Avg = 4.67
Eagle 2
Avg = 5.26

または、ヘッダーなしで次のように見えるさらに単純なもの: Avg = 4.67 Avg = 5.26

など...入力ファイルは、上記のようなデータを含む多くのヘッダーでいっぱいです。

私はパターンマッチングオプションを実行しようとしましたが、このようなもので NR を使用しましたが、awk ワンライナーとしては成功しませんでした:

awk '/01/1991,/01/1993 {sum+=$2; cnt+=1} {print "Avg =" sum/cnt}' myfile.txt

1991 年、1992 年、および 1993 年だけの平均値を取得しましたが、希望する平均値ではありませんでした。
あなたの助けは大歓迎です!

4

1 に答える 1

2

1991年から1993年だけを考慮したい場合

#! /usr/bin/awk -f

# new header, print average if exists, reset values
/[a-zA-Z]/ {
    if (cnt > 0) {
        print header;
        printf("Avg = %.2f\n", sum/cnt);
    }
    header=$0; sum=0; cnt=0;
}

# calculate average
/^01\/199[123]/ { sum+=$2; cnt++; }

# print last average
END {
    if (cnt > 0) {
        print header;
        printf("Avg = %.2f\n", sum/cnt);
    }
}

これはawkスクリプトを検索し、ヘッダーを検索し、平均があればそれを出力してから、次の平均計算のためにすべての変数をリセットします。データ行が見つかった場合は、後で平均に必要な合計を計算します。最後の行が読み取られると、最終的な平均が出力されます。

スクリプトは、1991年から1993年までの年のみを考慮します。より多くの年を含める場合は、計算行を複製するか、or演算子を使用して複数の年を追加できます。||

# calculate average
/^01\/199[0-9]/ || /^01\/200[0-9]/ { sum+=$2; cnt++; }

これは、1990年代と2000年代のすべてを考慮に入れています。

ヘッダーを印刷したくない場合は、適切な行を削除してprint headerください。

このawkスクリプトを次のように呼びます

awk -f script.awk myfile.txt
于 2013-02-26T17:50:54.467 に答える