bash から「group by」をシミュレートする最良の方法は? 質問する

bash から「group by」をシミュレートする最良の方法は? 質問する

各行に 1 つの IP アドレスが含まれるファイルがあるとします。

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 マシンでした。そして、これは興味深い問題だったと思います。

ですから、質問を責めるのではなく、気に入らない場合は無視してください。 :-)

ベストアンサー1

sort ip_addresses | uniq -c

最初にカウントが出力されますが、それ以外は希望どおりになるはずです。

おすすめ記事