아래와 같은 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
누락된 값을 조정해야 하는 경우 분모로 사용합니다.
답변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