我正试图想出一种方法来接收一个文件,其中每行有一个单词,并输出文件中最常用单词的日志以及它们发生的频率。
Namly,如果给我这样的文件(远比我看的那么短,但是为了清楚起见......):
dog
dog
cat
bird
cat
horse
dog
我会得到一个输出:
dog - 3
cat - 2
bird - 1
horse - 1
答案 0 :(得分:4)
这个怎么样:
[cnicutar@fresh ~]$ sort < file | uniq -c | sort -rn
3 dog
2 cat
1 horse
1 bird
然后你可以调整它以获得dog-3等等。
答案 1 :(得分:2)
$ awk '{arr[$1]++}END{for(a in arr){print a" - "arr[a]}}' file.txt | sort -nrk3
完整的awk版本:
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的另一种方法(就像你问的那样确切输出):
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