텍스트 파일의 행 전체에 대한 열 수의 빈도 인쇄

텍스트 파일의 행 전체에 대한 열 수의 빈도 인쇄

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

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

1개 열이 있는 4개 행, 4개 열이 있는 3개 행, 3개 열이 있는 1개 행, 9개 열이 있는 1개 행이 있음을 보여주는 출력을 갖고 싶습니다. 따라서 출력은 다음과 같아야 합니다: 행( 열)

4 (1)
1 (3)
3 (4)
1 (9)

내 실제 데이터가 엄청나다는 점을 고려하면 어떤 제안이라도 해주실 수 있나요? 한편, 마지막 행(여기서는 9)에 최대 열 수를 표시하고 출력의 첫 번째 행에 최소 열 수를 표시하고 싶습니다.

답변1

최신(> 4.0) 버전의 GNU awk를 사용하는 경우:

gawk '
  {a[NF]++} 
  END {
    PROCINFO["sorted_in"]="@ind_num_asc"; 
    for (i in a) printf "%d (%d)\n", a[i], i;
  }' file
4 (1)
1 (3)
3 (4)
1 (9)

답변2

둔한 사람접근 방식( asorti함수 사용):

awk '{a[NF]++}END{ asorti(a,b); for(i in b) printf("%d (%d)\n",a[b[i]],b[i]) }' file

출력:

4 (1)
1 (3)
3 (4)
1 (9)

  • asorti(a,b)- 인덱스를 기준으로 배열 정렬

답변3

원하는 결과를 생성하기 위해 테이블의 각 셀을 자리 표시자로 처리하면 중복된 줄을 정렬하고 계산하여 동일한 양의 열이 있는 줄 수를 식별할 수 있습니다.

a=$(sed 's/\([0-9]\+\)/1/g' file | sort | uniq -c)
dups=$( echo "$a" | cut -d' ' -f7 )

그런 다음 각 줄의 단어 수를 세어 행에 몇 개의 열이 있는지 식별할 수 있습니다.

words=$(echo "$a" | cut -d' ' -f8- | awk '{print NF}')
paste <(echo "$dups") <(echo "$words")
4       1
1       3
3       4
1       9

답변4

가장 간단한 버전은

cat data.txt | awk '{counts[NF] += 1} END { for (row_count in counts) { printf "%d (%d)\n", counts[row_count], row_count; }'

단지 NF행의 필드 수를 제공하고 사전에서 이와 연관된 관련 값을 업데이트하는 변수를 사용합니다. 그런 다음 스트림 끝에서 사전의 모든 키를 반복하고 요청된 형식으로 인쇄합니다.

관련 정보