부동 소수점 형식의 숫자가 포함된 파일이 있습니다. "그룹화"하여
볼 수 있습니다. 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