列の平均を計算して別の列にエクスポートします。

列の平均を計算して別の列にエクスポートします。

以下のtxtファイルがあります(このイメージは.csvバージョンのイメージです)。私がしたいことは、月の平均(列7から列10まで)を取り、これを新しい列にエクスポートすることです。しかし、それは私に平均だけを与えます。

OBSERVATORY,Abbreviations,COUNTRY,ALTITUDE(m),LONGITUDE(deg),LATITUDE (deg),January,February,March,April,May,June,July,August,September,October,November,December
Beverly-Begg Observatory Dunedin,,New Zealand,140,170.49,-45.8644,89.93,86.84,85.26,88.22,89.36,89.8,88.52,90.42,88.74,89.06,91.16,91.36
Aorangi Iti Observatory Lake Tekapo,,New Zealand,718,170.473,-44.0082,63.92,60.44,58.63,65.68,75.97,85.7,84.85,83.7,76.34,70.56,70.2,70.4
Mount John Observatory Lake Tekapo,,New Zealand,945,170.465,-43.9874,62.4,60.91,58.98,67.15,79.45,85.24,86.93,84.96,77.1,72.0,70.9,71.85

私のコードは次のとおりです

awk '{ sum += $5 + $6 + $7 + $8 + $9 + $10 + $11 + $12 + $13 + $14
+ $15 } END { print sum / (NR * 18) }' observatory_1.txt > observatory_3.txt


output: 0.104394

次のtxtフォルダを作成したいと思います。

OBSERVATORY, Abbreviations, COUNTRY, ALTITUDE(m), LONGITUDE(deg), LATITUDE (deg), MEAN
Beverly-Begg Observatory Dunedin, , New Zealand,  140, 170, 490, -45,8644, 89,05583333

どんなアドバイスも本当にありがとうございます。

答え1

スクリプトは、各入力行の複数の列を合計してから、すべての入力行を読み取った後、ENDブロックが出力行を印刷するため、出力を生成する前にファイル全体を処理します。

あなたがすべきことは、各入力ラインを個別に処理することです。

列番号も間違っているようです。たとえば、平均計算に高度、経度、緯度を含めるのはなぜですか?実際に7~19列(1月~12月)の平均が欲しいと仮定します。

とにかく、おそらく次のようなものがもっと欲しいでしょう。

awk -F, -v OFS=, '
     NR == 1 { print $1, $2, $3, $4, $5, $6, "MEAN" }
     NR  > 1 {
       sum = 0;
       for (i=7; i<=19; i++) { sum += $i }
       print $1, $2, $3, $4, $5, $6, (sum / 12)
     }' observatory_1.txt > observatory_3.txt

これにより、次のような出力が生成されます。

OBSERVATORY,Abbreviations,COUNTRY,ALTITUDE(m),LONGITUDE(deg),LATITUDE (deg),MEAN
Beverly-Begg Observatory Dunedin,,New Zealand,140,170.49,-45.8644,89.0558
Aorangi Iti Observatory Lake Tekapo,,New Zealand,718,170.473,-44.0082,72.1992
Mount John Observatory Lake Tekapo,,New Zealand,945,170.465,-43.9874,73.1558

これはまさにあなたが望むものではないかもしれませんが、正しい方向に進むステップでなければなりません。

答え2

使用幸せ(以前のPerl_6)

raku -e 'put get.split(",")[0..5].join(",") ~ ",MEAN"; \
      for lines() {my @a = .split(","); \
      put (@a[0...5].join(",") ~ "," ~ @a.[6..*].sum / @a.[6..*].elems)};'  

または

raku -ne 'state $i=0; ++$i; my @a = .split(","); $i == 1 \
      ?? put @a.[0..5].join(",") ~ ",MEAN" \
      !! put (@a[0...5].join(",") ~ "," ~ @a.[6..*].sum / @a.[6..*].elems);'  

入力例:

OBSERVATORY,Abbreviations,COUNTRY,ALTITUDE(m),LONGITUDE(deg),LATITUDE (deg),January,February,March,April,May,June,July,August,September,October,November,December
Beverly-Begg Observatory Dunedin,,New Zealand,140,170.49,-45.8644,89.93,86.84,85.26,88.22,89.36,89.8,88.52,90.42,88.74,89.06,91.16,91.36
Aorangi Iti Observatory Lake Tekapo,,New Zealand,718,170.473,-44.0082,63.92,60.44,58.63,65.68,75.97,85.7,84.85,83.7,76.34,70.56,70.2,70.4
Mount John Observatory Lake Tekapo,,New Zealand,945,170.465,-43.9874,62.4,60.91,58.98,67.15,79.45,85.24,86.93,84.96,77.1,72.0,70.9,71.85

出力例(上記の両方のコードソリューション):

OBSERVATORY,Abbreviations,COUNTRY,ALTITUDE(m),LONGITUDE(deg),LATITUDE (deg),MEAN
Beverly-Begg Observatory Dunedin,,New Zealand,140,170.49,-45.8644,89.055833
Aorangi Iti Observatory Lake Tekapo,,New Zealand,718,170.473,-44.0082,72.199167
Mount John Observatory Lake Tekapo,,New Zealand,945,170.465,-43.9874,73.155833

最初の答えの簡単な説明:getヘッダー行、splitカンマ、およびput最初の6つの列をMEAN 使用します.split(",")[0..5].join(",") ~ ",MEAN"。(ICYMI、~チルダはRakuで文字列を連結するために使用されます)。

次に、2行目(最初のデータ行)で行ごとの読み取りカーソルを使用してfor lines()入力(行別)を読み取り、コンマ内の要素を配列に保存しますsplit。最初の6列は平均を使用して計算されます。","@a@a[0..5]put@a.[6..*].sum / @a.[6..*].elems

ハードコーディングされた列インデックスを使用することもできます。@a.[6..17].sum / @a.[6..17].elems常に12列であればそうする@a.[6..17].sum / 12ことができます。最後に @a.[6..17].map(*.chars > 0).sum欠落している値を調整する必要がある場合は、分母として使用します。

https://raku.org

答え3

私たちはGNUを使ってこれを行うことができます直流RPN電卓。しかし、その前に3つの変換が必要です。これは次のように行われます。真珠:

  • 数値以外のフィールドを[]で囲みます。
  • 数値フィールドの負の記号が_に変更されました。
  • カンマを空白に変更します。
perl -F, -lane 'my $i;
  print join " ",  map {
    $i++ < ($.>1?3:@F) ? qq([$_]) : s/^-/_/r;
  } @F;
' file |
dc -e "
#### macros definitions
[q]sq [44an]sz # OFS set to  comma
[+z7<a]sa # aum last 12 entries
[SMz0<b]sb # shunt remaining to M
[LMnz6>zzz6>c]sc # print LIFO M
[?z0=q
  lax #sum last 12 cols
  lbx #store all in stack M
  lcx #print
  LM12.0/p #orint average
cz0=?]s?

###> header processing
?[
  [4k]s0 [XrX=0z6<1]s1
  l1x lbx lcx [MEAN]pc
]x

##> non header lines
l?x
"

OBSERVATORY,Abbreviations,COUNTRY,ALTITUDE(m),LONGITUDE(deg),LATITUDE (deg),MEAN
Beverly-Begg Observatory Dunedin,,New Zealand,140,170.49,-45.8644,89.0558
Aorangi Iti Observatory Lake Tekapo,,New Zealand,718,170.473,-44.0082,72.1991
Mount John Observatory Lake Tekapo,,New Zealand,945,170.465,-43.9874,73.1558

関連情報