1行に1つの単語があるファイルを取り込んで、ファイル内で最も頻繁に使用される単語とそれらが発生した頻度のログを出力する方法を見つけようとしています。
ナムリー、私がこのようなファイルを与えられた場合(私が見ているものよりはるかに短いですが、明確にするために...):
dog
dog
cat
bird
cat
horse
dog
次のような出力が得られます。
dog - 3
cat - 2
bird - 1
horse - 1
1行に1つの単語があるファイルを取り込んで、ファイル内で最も頻繁に使用される単語とそれらが発生した頻度のログを出力する方法を見つけようとしています。
ナムリー、私がこのようなファイルを与えられた場合(私が見ているものよりはるかに短いですが、明確にするために...):
dog
dog
cat
bird
cat
horse
dog
次のような出力が得られます。
dog - 3
cat - 2
bird - 1
horse - 1
これはどう:
[cnicutar@fresh ~]$ sort < file | uniq -c | sort -rn
3 dog
2 cat
1 horse
1 bird
次に、それを微調整して、dog-3などを取得できます。
$ 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