파일에서 숫자를 그룹화하는 방법

파일에서 숫자를 그룹화하는 방법

부동 소수점 형식의 숫자가 포함된 파일이 있습니다. "그룹화"하여
볼 수 있습니다. sort -rn numbers.txt | less
즉, 같은 범위에 몇 개가 있는지 쉽게 확인할 수 있습니다.
파일의 예를 들어보세요:

30.9695041179657  
30.8851490020752  
30.2127060890198  
29.1361880302429  
26.4587681293488   
25.8535399436951   
25.7361891269684   
25.7305450439453   
25.1068568229675   
24.7598769664764   
24.3106801509857   
24.0782940387726   

나는 정확성에 관심이 없습니다. 따라서 파일의 모든 숫자에 대해 25가 몇 개인지 알고 싶습니다. 예를 들어 이 경우에는 4와 30 등이 있습니다.
따라서 이 예의 경우 출력은 30의 경우 3, 29의 경우 1, 26의 경우 1, 25의 경우 4, 24의 경우 3입니다.
이를 수행하는 쉬운 방법이 있습니까?

답변1

어때요?

cut -d. -f1 numbers.txt | sort | uniq -c

샘플 데이터를 사용하여

$ cut -d. -f1 numbers.txt | sort | uniq -c
      3 24
      4 25
      1 26
      1 29
      3 30

답변2

그리고 awk( mawk):

$ awk -F . '{COUNTS[$1]++} END{for(ct in COUNTS) {printf("%d %d time(s)\n", ct, COUNTS[ct])}}' test.txt
30 3 time(s)
24 3 time(s)
25 4 time(s)
26 1 time(s)
29 1 time(s)

-F필드 구분 기호( FS)를 로 설정합니다. 단, 소수 구분 기호( ) 앞의 항목을 사용하여 .모든 행을 반복 하고 배열에서 해당 항목이 발견된 횟수를 기록합니다 .{COUNTS[$1]++}$1.COUNTS

마지막으로 ( END {}) 우리가 찾은 것을 덤프합니다. 보시다시피 가장 큰 부분은 출력입니다.

파일에서 더 읽기 쉽습니다.

{COUNTS[$1]++}
END {
  for(ct in COUNTS)
  {
    printf("%d %d time(s)\n", ct, COUNTS[ct])
  }
}

답변3

당신이 사용할 수있는 awk:

awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile

출력을 정렬하려면 출력을 다음으로 파이프하십시오 sort.

awk '{a[int($1)]++}END{for (i in a) {print a[i], i}}' inputfile | sort -k2

예제 입력의 경우 다음이 생성됩니다.

3 24
4 25
1 26
1 29
3 30

답변4

파일이 이미 정렬된 것 같으니 다음과 같이 하세요.

$ uniq -c <(perl -pe 's/\.\d*//' file)
      3 30
      1 29
      1 26
      4 25
      3 24

아직 정렬되지 않은 경우:

$ uniq -c <(perl -pe 's/\.\d*//' file | sort -rn)
      3 30
      1 29
      1 26
      4 25
      3 24

관련 정보