![전체 프로그램](https://linux55.com/image/93571/%EC%A0%84%EC%B2%B4%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8.png)
dataset.csv
7개의 숫자 열이 포함된 대용량 데이터 파일이 있습니다. AWK가 각 열의 평균과 분산을 계산하는 가장 빠르고 효율적인 방법이라는 것을 읽었습니다. CSV 파일을 반복하고 결과를 요약 CSV로 출력하려면 AWK 명령이 필요합니다. 예시 데이터세트:
1 1 12 1 0 0 426530
1 1 12 2 0 0 685455
3 4 12 3 1 0 1182080
1 1 12 4 0 1 3090
2 1 13 5 0 0 386387
1 3 12 6 0 2 233430
3 1 11 7 1 0 896919
1 1 12 8 0 0 16441
생성된 요약 csv는 아래와 같습니다. 첫 번째 행은 각 열의 평균에 해당하고 두 번째 행은 분산(표본 기반)입니다.
1.625 1.625 12 4.5 0.25 0.375 478791.5
0.839285714 1.410714286 0.285714286 6 0.214285714 0.553571429 1.74812E+11
단일 열 값을 계산할 수 있었지만 모든 열에 대해 반복하려면 이 값이 필요합니다.
awk -F' ' '{ total += $1 } END {print total/NR}' dataset.csv > output.csv
답변1
모든 열에 루프가 필요합니다
{ for(i=1;i<=NF;i++) ...
그리고 배열
... total[i]+=$i ; sq[i]+=$i*$i ; }
결과적으로 (평균적으로) 유사한 명령줄이 생성됩니다.
awk '{ for(i=1;i<=NF;i++) total[i]+=$i ; }
END { for(i=1;i<=NF;i++) printf "%f ",total[i]/NR ;}'
전체 프로그램
평균과 분산을 계산하기 위해 awk를 사용했지만 결과를 얻지 못했습니다.
{ for(i=1;i<=NF;i++) {total[i]+=$i ; sq[i]+=$i*$i ; } }
END {
for(i=1;i<=NF;i++) printf "%f ",total[i]/NR ;
printf "\n" ;
for(i=1;i<=NF;i++) printf "%f ",sq[i]/NR-(total[i]/NR)**2 ;
printf "\n" ;
}
답변2
"C" 방법,문서. 아마도 효율적이거나 깨끗하지는 않지만 읽기가 더 쉬울 것입니다. NxM 공백으로 구분된 요소를 포함하는 데이터 파일의 각 열의 평균과 분산을 계산합니다.
#!/bin/awk -f
BEGIN { } {
if (max_nf < NF)
max_nf = NF
max_nr = NR
for (x = 1; x <= NF; x++)
mat[x, NR] = $x
} END {
for (x = 1; x <= max_nf; x++) {
mean = 0.0
var = 0.0
for (y = 1; y <= max_nr; y++) {
var += (y - 1) * (mat[x, y] - mean) * (mat[x, y] - mean) / y
mean += (mat[x, y] - mean) / y
}
printf("%f %f\n", mean, var / (max_nr - 1))
}
}
예제를 실행하세요:
./ColVarAndMean.awk dataset.csv > output.dat && cat output.dat
1.625000 0.839286
1.625000 1.410714
12.000000 0.285714
4.500000 6.000000
0.250000 0.214286
0.375000 0.553571
478791.500000 174812449479.714294
답변3
awk -F ',' '{print;x+=$2}END{print "MEAN" x/NR}' filename.csv
두 번째 열 은 $2
변수에 값을 저장할 수 있는 NR
레코드 수 입니다.$2
x