텍스트 파일의 행과 열이 교차하는 빈도를 인쇄합니다.

텍스트 파일의 행과 열이 교차하는 빈도를 인쇄합니다.

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

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

4행과 1열, 3행과 4열, 1행과 3열, 1행과 9열을 표시하는 출력을 원합니다. 따라서 출력은 다음과 같아야 합니다: row(column)

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변수를 사용하여 행의 필드 수를 제공하고 사전에서 이와 연관된 관련 값을 업데이트합니다. 그런 다음 스트림 끝에서 사전의 모든 키를 반복하고 요청된 형식으로 인쇄합니다.

관련 정보