すべての単語のテキストファイルの単語出現回数を取得し、出力をソートして出力します


28

テキストファイルを処理し、単語のすべての出現をカウントし、次のように出力するコマンドがありました。

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

したがって、1行ずつではなく、単語ごとに検索し、1単語だけでなく、すべての単語に対しても検索します。私はずっと前にインターネットのどこかでそれを見つけましたが、それを見つけたり覚えたりすることはできません。

回答:


33

私はawkのtr代わりに使用します:

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr スペースを改行で置き換えるだけです
  • grep -v "^\s*$" 空の行を切り取ります
  • sort の入力として準備する uniq
  • uniq -c 発生をカウントする
  • sort -bnr 空白を無視しながら数値の逆順でソートします

ワオ。それは行ごとの誓いを数えるための素晴らしいコマンドであることが判明しました

見つける。-name "* .py" -exec cat {} \; | tr '[:space:]' '[\ n *]' | grep -v "^ \ s * $" | 並べ替え| uniq -c | sort -bnr | グレップファック


tr -s特にインデントが発生した場合に、複数のスペースを処理するために使用する場合があります。
アルセージュ

@Arcege:良い点。結果を変更することはありませんが、スクリプトを少し固定する場合があります。
12

-g--general-numeric-sort)のオプションは、sort場合によっては好ましいかもしれません。例えばsort -n続ける10\n1 4治療、などである1 414しながら、sort -gとして正しくそれを扱います1 4\n10
スキッピールグラングロー

良いコマンド、本当に投票に値する:)
Noor

@seler以下のようにgrepとtrの部分をさらにシンプルにできると思います:echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnr私は初心者なので、間違っているかもしれないことに注意してください。
smc

8
  1. 入力を単語ごとに1行に分割します。
  2. 結果の単語(行)のリストを並べ替えます。
  3. 複数回発生します。
  4. 出現回数で並べ替えます。

入力を単語に分割するには、単語の区切りと見なされる文字を改行で置き換えます。

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

これは、単語が無視したい非単語句読点のすぐ隣にある場合を処理できるため、良い答えです。
デビッドグレイソン

5

grepとawkを使用していませんが、これはあなたが望むことをするようです:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
入力にシェルワイルドカードが含まれている場合(これは追加する必要がありますset -f)、これは機能しません。句読点を単語の一部として扱います(句読点文字を追加することで不便に修正できますIFS。これは、ファイル全体をメモリに保存するため(非常にsort賢い)、非常に大きな入力ファイルには適していません。
ジル 'SO-悪であるのをやめる

2

このようなことをしていると思いますか?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

もちろん、あなたも同じことをすることができますawk:)



0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

ファイルを単語に分割した後、昇順でソートします。

シンプルなgrepがございますfishfisheye、あなたが部分一致を防ぐためにはgrepコマンドを強化する必要がありますので、。

古典的なHDD(IDE)の時代のマシンで、25kのテキストファイルに約3秒かかります。

大きなファイルまたは頻繁に実行される操作の場合、ハッシュマップアプローチの方が適していますが、めったにジョブを実行しない場合や小さなファイルの場合のみで十分かもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.