-1

行ごとに 1 つの値と 2 つの重みを含む入力ファイルがあります。

重みに従って、最初の列の値が 1 行に 1 回繰り返される 2 つの出力ファイルを生成したいと思います。これは、短い例で説明するのがおそらく最も適切です。入力ファイルが次の場合:

ファイル内:

35   2   0
37   2   3
38   0   4

次に、2 つの出力ファイルを生成したいと思います。

ファイル.out1:

35 
35
37
37

ファイル.out2:

37
37
37
38
38
38
38

次に、これらの出力ファイルを使用して、2 列目と 3 列目の重みに従って、1 列目の平均と中央値を計算します。

私の質問が明確であることを願っています。助けてくれてありがとう。

4

2 に答える 2

1

これは非常に簡単ですawk

awk '{for(i=0;i<$2;i++) print $1;}' file.in > file.out1

最初のファイルを生成し、

awk '{for(i=0;i<$3;i++) print $1;}' file.in > file.out2

2番目を生成します

これらのファイルから平均値と中央値を計算する方法を知っているかどうかは、あなたの質問からは明らかではありません.これらの出力ファイルを作成したかっただけのようです. 残りが問題を引き起こしているか、または上記のスクリプトが明確でないかどうかをお知らせください (かなり自明だと思います)。

于 2014-06-27T13:06:38.717 に答える
1

私がよく理解していれば、平均と中央値が必要です。

平均:

awk '{a+=$1}END{print a/NR}' file.in
36.6667

中央値:

cat file.in | awk '{print $1}' | sort | awk '{a[NR]=$1}END{ b=NR/2; b=b%1?int(b)+1:b; print a[b] }'
37

説明:

簡単に言えば、NR は行数を保持する変数です。平均では、すべての行の合計を行数で割った値が必要です。

中央値の場合、入力を並べ替えて中央値を選択する必要がありますが、3行の数を2で割ると1.5になるため、入力はそれほど単純ではありません。したがって、awkにはない天井関数が必要です。私はそれをやっていますb=NR/2; b=b%1?int(b)+1:b;

これが役立つことを願っています。

于 2014-06-27T13:27:39.980 に答える