Unix에서 파일의 행 전체에 대한 평균 열 수와 최대 열 수를 계산하는 방법은 무엇입니까?

Unix에서 파일의 행 전체에 대한 평균 열 수와 최대 열 수를 계산하는 방법은 무엇입니까?

다음과 같은 파일이 있습니다.

1
2 4 5 6 7 19
20
22
24 26 27 
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300

내 실제 데이터 파일이 엄청 크다는 점을 고려하면. 그래서 이 데이터 파일의 최대 개수가 얼마인지 확인하고 싶습니다. 또한 한 행에 평균적으로 몇 개의 열이 있는지 확인하고 싶습니다. 이 작은 예의 예로 최대 열 수는 9(행 5)이고 행 내의 평균 열 수는 3.33입니다. 어떤 제안이 있으십니까?

답변1

$ awk 'NF > m { m = NF } { s += NF } END { printf("Max = %d\nAvg = %g\n", m, s/NR) }' data.in
Max = 9
Avg = 3.33333

스크립트 awk는 의 최대 필드(열) 수 m와 의 필드 수 합계를 추적합니다 s. 입력 스트림의 끝에 도달하면 수집된 통계가 출력됩니다.

현재 레코드(행)의 필드 개수는 개이며 NF, 지금까지 읽은 레코드 개수는 개입니다 NR.

다음 버전은 필드 수가 가장 많은 레코드도 추적합니다.

awk 'NF > m { m = NF; r = NR } { s += NF } END { printf("Max = %d (%d)\nAvg = %g\n", m, r, s/NR) }' data.in
Max = 9 (6)
Avg = 3.33333

답변2

"dc" 유틸리티를 사용하여 수학 작업을 수행할 수 있습니다.

dc -e "
[zsmlksn]sb
[lk1+skzls+ss]sa
[[Max = ]nlmn[(]nlnn[)]n10an[Avg = ]n5klslk/1/n10an]sp
[lpxq]sq
[?z0=qlaxzlm<bcl?x]s?
0ddddsksmsnssd=?
"

아래는 위의 작동 방식을 보여줍니다.

tr '\t-' ' _'  data.in | # dc wants negative numbers to begin with underscores
dc -e "
[
   z sm  # store current num of cols in register "m"
   lk sn # store row num in register "n"
]sb

[
   lk 1 + sk # increment the number of rows
   z ls + ss # add num of cols to running sum of cols
]sa

[
   [Max=]n
   lmn             # put max number of cols on ToS & print it
   [(]n
      lnn          # put row num at which max number of cols are present on ToS & print it
   [)]n
   10an

   [Avg=]n
     5k ls lk /1/n  # accuracy of 5 digits, compute average = sum of cols / total num of cols
   10an

]sp

[
   lpx # print the results by invoking the macro "p"
   q   # quit
]sq

# while loop for reading in lines
[
   ? z 0 =q # quit when no columns found in the current line read in
   lax      # macro "a" does: rows++, sum+=cols
   z lm <b  # update max cols value stored in register "lm" when cols > lm
   c        # clear out the line and read in the next line
   l?x      # read the next line
]s?

# initializations+set the ball rolling:
# register "sk" -> line kount
# register "sm" -> max cols
# register "sn" -> row number corresp. to max cols
# register "ss" -> sum of cols

0
  d  d  d  d
  sk sm sn ss
d=?
"

결과

Max = 9(6)
Avg = 3.33333

관련 정보