2012-11-18 2 views
1

한 줄에 하나의 단어가있는 파일을 가져 와서 가장 자주 사용되는 단어의 로그와 그 빈도를 출력하는 방법을 알아 내려고합니다.UNIX - 문서의 대부분 요소 찾기

Namly,이 (내가보기에 무엇을 찾고보다 짧은,하지만 명확성을 위하여 ...) 같은 파일을 주어진 경우 :

: 나는 같은 출력을 얻을 것이다

dog 
dog 
cat 
bird 
cat 
horse 
dog 

+0

스크립트 언어의 숫자는 당신과 가장 잘 알고있는이다, 쉽게 할 수있는 대부분의 유닉스 시스템에서 사용할 수 있습니까? 파이썬, 쉘 스크립팅, PHP, Perl? – noisewaterphd

답변

4

dog - 3 
cat - 2 
bird - 1 
horse - 1 
이 방법에 대해 :

[[email protected] ~]$ sort < file | uniq -c | sort -rn 
    3 dog 
    2 cat 
    1 horse 
    1 bird 

그런 다음 등등 개-3 및 얻을 수를 조정할 수 있습니다. 사용

+0

"bird"는 OP와 동일한 위치에서 정렬되지 않습니다. –

+0

맨 위 5 단어 만 터미널에 인쇄 할 수 있도록 이러한 명령을 수정할 수 있습니까? –

+1

@ShawnTaylor'head'에 또 다른 파이프를 가질 수 있습니다. 'head -n5'를 해보십시오. – squiguy

2

& :

$ awk '{arr[$1]++}END{for(a in arr){print a" - "arr[a]}}' file.txt | sort -nrk3 

전체 버전 :

awk '{ 
    arr[$1]++ 
} 
END{ 
    for (i in arr) tmpidx[sprintf("%12s", arr[i]),i] = i 
    num = asorti(tmpidx) 
    j = 0 
    for (i=num; i>=1; i--) { 
     split(tmpidx[i], tmp, SUBSEP) 
     indices[++j] = tmp[2] 
    } 
    for (i=1; i<=num; i++) print indices[i], arr[indices[i]] 
}' file.txt 

출력

dog - 3 
cat - 2 
horse - 1 
bird - 1 

을 사용하는 또 다른 방법(당신이 질문처럼 정확한 출력) :

perl -lne ' 
    END{ 
     print "$_ - $h{$_}" for reverse sort {$h{$a} cmp $h{$b}} keys %h 
    } 
    $h{$_}++ 
' file.txt 

OUTPUT

dog - 3 
cat - 2 
bird - 1 
horse - 1 
+0

쿨 솔루션! :-) – cnicutar

+0

재미만을위한 풀 awk 솔루션 추가 ... –

+0

Perl 솔루션 추가 –