UNIX - 查找文档中的大多数元素

时间:2012-11-18 07:13:07

标签: unix

我正试图想出一种方法来接收一个文件,其中每行有一个单词,并输出文件中最常用单词的日志以及它们发生的频率。

Namly,如果给我这样的文件(远比我看的那么短,但是为了清楚起见......):

dog
dog
cat
bird
cat
horse
dog

我会得到一个输出:

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

2 个答案:

答案 0 :(得分:4)

这个怎么样:

[cnicutar@fresh ~]$  sort < file | uniq -c | sort -rn
   3 dog
   2 cat
   1 horse
   1 bird

然后你可以调整它以获得dog-3等等。

答案 1 :(得分:2)

使用&amp;

$ 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

<强>输出

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