열의 평균을 계산하여 다른 열로 내보냅니다.

열의 평균을 계산하여 다른 열로 내보냅니다.

아래와 같은 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에서 문자열을 연결하는 데 사용됩니다).

이제 두 번째 라인(첫 번째 데이터 라인)에서 라인별 읽기 커서를 사용하여 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

관련 정보