"유사한 질문"을 살펴봤지만 내 문제를 해결하는 것 같지 않습니다.
큰 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
출력 파일에 새 데이터 포인트로 추가하지 않습니다. 대신 다음 avgx
과 avgy
다음 의 값을 계산하겠습니다.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