1. ホーム
  2. バッシュ

[解決済み】bashから "group by "をシミュレートする最良の方法とは?

2022-05-02 05:23:53

質問

IPアドレスを1行に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

一つの方法として

cat ip_addresses |uniq |while read ip
do
    echo -n $ip" "
    grep -c $ip ip_addresses
done

しかし、これでは効率的とはとても言えません。

bashを使ってより効率的にこの問題を解決するにはどうしたらよいでしょうか?

(一つ付け加えると、perlやawkから解決できることは知っていますが、私はそれらの言語ではなく、bashでのより良い解決策に興味があります)。

追加情報

ソースファイルが5GBで、アルゴリズムを実行するマシンが4GBだとします。ですから、ソートは効率的な解決策ではありませんし、ファイルを何度も読み込むこともできません。

ハッシュテーブルのようなソリューションが気に入ったのですが、どなたかこのソリューションの改善点を教えてください。

追加情報その2。

なぜわざわざbashでやるのか、perlなどの方がずっと簡単ではないか、という質問もありました。その理由は、私がこの作業をする必要があったマシンでは、perlが使えなかったからです。カスタムビルドのLinuxマシンで、私が使い慣れたツールはほとんどありませんでした。そして、それは興味深い問題だったと思います。

だから、質問を責めないで、嫌なら無視してください :-)

解決方法は?

sort ip_addresses | uniq -c

これは最初にカウントを表示しますが、それ以外はあなたが望むとおりのものになるはずです。