`awk`는 지정된 행 수의 열을 합산할 수 있나요?

`awk`는 지정된 행 수의 열을 합산할 수 있나요?

"유사한 질문"을 살펴봤지만 내 문제를 해결하는 것 같지 않습니다.

큰 CSV 입력 파일이 있습니다. 파일의 각 행은 x,y데이터 포인트입니다. 여기에 설명을 위한 몇 줄이 있지만 일반적으로 데이터는아니요 단조로운:

1.904E-10,2.1501E+00  
3.904E-10,2.1827E+00  
5.904E-10,2.1106E+00  
7.904E-10,2.2311E+00  
9.904E-10,2.2569E+00  
1.1904E-09,2.3006E+00  

입력 파일보다 작은 출력 파일을 생성해야 합니다. 출력 파일에는 다음이 포함됩니다.이하 한 줄모든N라인입력 파일에. 출력 파일의 각 줄은 x,y데이터 포인트입니다.평균x,y가치N라인입력 파일.

예를 들어, 입력 파일의 총 라인 수가 3,000이고N=3, 출력 파일에는 다음이 포함됩니다.이하1,000줄. 위 데이터를 사용하여 이 예를 완료하려면 위 데이터의 처음 3개 행이 아래와 같이 단일 행으로 대체됩니다.

x = (1.904E-10 + 3.904E-10 + 5.904E-10) / 3 = 3.904E-10

y = (2.1501E+00 + 2.1827E+00 + 2.1106E+00) / 3 = 2.1478E+00 또는:

3.904E-10,2.1478E+00 

출력 파일의 한 줄에 해당합니다.

나는 한동안 이 문제를 다루었지만 아직 제대로 해결하지 못했습니다. 이게 제가 처리해 왔던 일인데 어떻게 해야 할지 모르겠어요반복NR전체 파일 값을 반복합니다.

awk -F ',' 'NR == 1, NR == 3 {sumx += $1; avgx = sumx / 3; sumy += $2; avgy = sumy / 3} END {print avgx, avgy}' CB07-Small.csv

이 문제를 더 복잡하게 만들려면 출력 파일을 더욱 "슬리밍"해야 합니다.

avgy(위에서 계산된) 값이 다음과 같은 경우폐쇄출력 파일의 마지막 값의 경우 avgy출력 파일에 새 데이터 포인트로 추가하지 않습니다. 대신 다음 avgxavgy다음 의 값을 계산하겠습니다.N라인입력 파일."폐쇄"마지막 값의 백분율로 정의되어야 합니다 argy. 예를 들어:

현재 계산된 값이 avgy출력 파일에 기록된 마지막 값의 10% 내에 있는 경우 avgy새 값을 출력 파일에 쓰지 마십시오.

편집 기록 보기

답변1

일반적인 변형은 다음과 같습니다.

BEGIN { OFS = FS = "," }

{
    for (i = 1; i <= NF; i++) sum[i] += $i
    count++
}

count % 3 == 0 {
    for (i = 1; i <= NF; i++) $i = sum[i] / count
    delete sum
    count = 0
    if ($NF >= 1.1 * last || $NF <= 0.9 * last) {
        print
        last = $NF
    }
}


END {
    if (count > 0) {
        for (i = 1; i <= NF; i++) $i = sum[i] / count
        if ($NF >= 1.1 * last || $NF <= 0.9 * last) print
    }
}

남은 음식은 덩어리와 비슷한 방식으로 처리되어야 한다고 생각합니다.질소철사.

답변2

회선 상태와 10% 규칙을 확인합니다. 10% 규칙에는 수표 가치가 선형적으로 증가하는 부작용이 있다는 점을 기억하십시오.

$ awk -F ',' '
  BEGIN{
    N=3; prev_y=0
  }
  {
    x+=$1;
    y+=$2;
    i++
  }
  NR%N==0 && (y/i) <= (prev_y)*1.1{ x=0; y=0; i=0 }
  NR%N==0 && (y/i) > (prev_y)*1.1{
    print x/i","y/i;
    prev_y=y/i; x=0; y=0; i=0
  }' file

관련 정보