파일 열의 평균을 구하다

파일 열의 평균을 구하다

타임스탬프 데이터가 포함된 CSV 파일과 매월 별도의 파일로 나누는 스크립트가 있습니다. 이 스크립트는 해당 월의 데이터를 가져와서 평균을 단일 값으로 계산합니다. 코드의 일부는 다음과 같습니다. 다른 모든 달은 1월 첫 번째 달과 동일합니다. 이 코드는 1년 길이의 파일을 열 9를 기준으로 여러 달(1-12번째 달)로 분할하고 17개 필드를 모두 인쇄합니다. 다음 코드 줄은 열 13을 보고 파일의 모든 데이터(누락된 데이터 무시, -999로 지정됨)의 평균을 계산하고 열 평균을 새 $i.monthlyavg 파일에 인쇄합니다.

awk -F ',' '$9= 1 {print $0}' $i > Jan.tmp
awk 'NR > 1 { for i = 13) if ($i != -999) {sum[i] += $i; num[i]++}
END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }' Jan.tmp > $i.monthlyavg

다음과 같은 오류 메시지가 나타납니다...

awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:              ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                    ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                  ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                              ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1:                                                                                                   ^ syntax error

그리고

 END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:       ^ syntax error
awk: cmd. line:2:       END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:                        ^ syntax error
awk: cmd. line:2:       END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2:                                                                  ^ unexpected newline or end of string

문제가 무엇입니까?

답변1

9열의 각 개별 값에 대해 13열의 숫자 평균을 구하려는 경우 9열의 각 값에 대해 별도의 파일을 만들 필요가 없습니다. 개별 합계를 추적하고 마지막에 모두 출력하면 됩니다.

awk -F, '
    $13 != -999 { s[$9] += $13; n[$9]++ }
    END { for (i in s) print i, s[i]/n[i] }' some-file

코드의 주요 문제는 루프를 작성한 방식에 구문 오류가 있다는 것입니다 for. for열 13에만 액세스하므로 루프가 전혀 필요하지 않습니다.


루프 for에는 두 가지 스타일이 있습니다 awk. for아마도 사용하고 싶은 "산술 루프"가 있습니다 . 일반적으로 카운터를 사용하여 일부 초기화로 시작하고 일부 논리가 더 이상 테스트되지 않을 때까지 반복됩니다.진짜, 일부 업데이트:

for (initialization; logical-test; update) statement

예를 들어

for (i = 1; i <= NF; ++i) print i

다른 유형은 위의 답변에서 보여드린 유형으로, 배열의 인덱스를 반복하는 데 사용됩니다. 루프는 특정 순서로 인덱스를 반복할 수 없습니다.

for (index-variable in array) statement

예를 들어

for (key in data) print key, data[key]

답변2

for (i = 13)전혀 유효한 awk 구성이 아닙니다. (이것이 for i = 13) 구문적으로 전혀 유효하지 않다는 것을 꼭 말해야 합니까 ?) for이 명령문에는 두 가지 버전이 있습니다.

  • for (expr1; expr2; expr3) statement
  • for (var in array) statement

첫 번째 ( )를 사용하려는 것 같습니다. 17개 필드를 모두 보려면 , 또는 를 사용할 수 있습니다. 필드 #13만 처리하고 루프 구조를 유지하려는 경우에는 다음을 사용할 수 있습니다. 그러나 이 특정 작업을 수행하기 위한 간단하고 간단한 코드를 원하는 경우에는 다음을 사용할 수 있습니다.for (expr1expr2expr3statementfor (i = 1; i <= 17; i++)for (i = 1; i <= NF; i++)for (i = 13; i <= 13; i++)

  • i = 13; if ($i != -999) {sum[i] += $i; num[i]++},
  • if ($13 != -999) {sum[13] += $13; num[13]++}, 또는
  • if ($13 != -999) {sum += $13; num++}

...하나의 열만 다루는 경우에는 배열이 필요하지 않기 때문입니다.

그리고 "그들"이 언급했듯이아주 아주큰따옴표 안에 awk를 실행하는 것과 같습니다. 모든 것이 정상입니다매우 많은작은따옴표를 사용하는 것이 더 좋습니다.

관련 정보