IPアドレスを含むファイルがあり、各行に1つのアドレスがあるとします。
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
各IPアドレスがファイルに出現する回数をカウントするシェルスクリプトが必要です。上記の入力には、次の出力が必要です。
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
これを行う1つの方法は次のとおりです。
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
しかし、それは実際には効率的ではありません。
どのようにbashを使用してこの問題をより効率的に解決しますか?
(1つ追加する必要があります。私はそれがperlまたはawkから解決できることを知っています。これらの言語ではなく、bashのより良いソリューションに興味があります。)
追加情報:
ソースファイルが5GBで、アルゴリズムを実行しているマシンが4GBであるとします。したがって、並べ替えは効率的なソリューションではなく、ファイルを複数回読み取ることもありません。
私はハッシュテーブルのようなソリューションが好きでした-誰でもそのソリューションに改善を提供できますか?
追加情報#2:
たとえばperlのほうがずっと簡単なのに、なぜbashを使うのが面倒なのかと尋ねる人もいました。その理由は、私がこのperlを実行しなければならなかったマシンでは、私は利用できなかったからです。これは、私が慣れているほとんどのツールを持たないカスタムビルドのLinuxマシンでした。そして、それは興味深い問題だったと思います。
だから、質問のせいにせず、気に入らなければ無視してください。:-)