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

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

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

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추적합니다 . 입력 스트림의 끝에 도달하면 수집된 통계가 출력됩니다.ms

현재 레코드(라인)의 필드 개수는 이고 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

관련 정보