
次のようにテキストファイルを処理し、すべての単語の数を数えて印刷するコマンドがあります。
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単語だけを検索するのではなく、すべての単語を検索します。ずっと前にインターネットのどこかで見つけましたが、見つけることも覚えていません。
答え1
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 |ソート-bnr | grep くそ
答え2
- 入力を1行に1つずつ単語に分割します。
- 結果単語(行)のリストを並べ替えます。
- 圧着が複数回発生します。
- 発生順に並べ替えます。
入力を単語に分割するには、単語区切り文字と考えられるすべての文字を改行文字に置き換えます。
<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
# them word constituents
sort |
uniq -c |
sort -nr
答え3
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
答え4
あなたはこのようなことをしていると思いますか?
$ 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
もちろん同じようにしてもいいです:)