人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記のことがシェルスクリプトだけでできるかどうか教えてください。

apple
orange
apple
apple
orange



という改行区切りに単語が並んでいるリストがテキストに保存されています。
これらの単語は予測できないものとします。
このリストから

apple 5
lemon 4
orange 2

というように、出現した単語をすべてリストアップし、個数を数え、多い順に並べ替え、表示または保存する、というようなことをしたいです。
SQL で言うならば
SELECT 単語,count(*) FROM 単語リスト GROUP BY 単語 ORDER BY count(*) DESC
と同じことを、シェルスクリプトだけで行いたいのです。

環境は RHEL または CentOS の 5.x 系で、 Web用途ではないマシンのため、各種CGIやデータベースは入れてません。
何か良いアイデアはないでしょうか。

●質問者: chocococoa
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Apple CentOS CGI GROUP Orange
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● andrew
●30ポイント ベストアンサー

cat FILE | sort | uniq -c | sort -nr | awk '{print $2,$1}'

で FILE に入っている単語を表示できます。

出力をファイルにリダイレクトすればファイルにも保存可能です。

◎質問者からの返答

すばやいご回答、ありがとうございます。

全てにおいて適した結果になっております。


2 ● pahoo
●25ポイント

個数が冒頭に表示されても良ければ、1行でできます。

ターゲットのテキストは "hoge.txt" に記されているとします。

sort hoge.txt | uniq -c | sort -r
◎質問者からの返答

最低限パイプ2つあれば良いというシンプルなご回答ですね。

理解しやすいです。ありがとうございます。


3 ● b-wind
●20ポイント
$ cat sample.txt | sort | uniq -c | sort -k 2 -n -r 

Manpage of SORT

Manpage of UNIQ

◎質問者からの返答

ありがとうございます。こちらも問題なく動きました。

ただ、 -k 2 が意味するところが良く分からないです。


4 ● sphire
●20ポイント
$ cat hoge.txt | sort | uniq -c | sed 's/^ *\([0-9]*\) *\(.*\)$/\2 \1/'
◎質問者からの返答

ありがとうございます。 sed により表示もバッチリです。

ただ、要件の「多い順に並べ替え」ができませんでした。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ