以下の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
欠落している値を調整する必要がある場合は、分母として使用します。
答え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