Her satırda bir adres olan IP adresleri içeren bir dosyanız olduğunu varsayalım:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Her IP adresi için dosyada kaç kez göründüğünü sayan bir kabuk betiğine ihtiyacınız vardır. Önceki giriş için aşağıdaki çıkışa ihtiyacınız vardır:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Bunu yapmanın bir yolu:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Ancak gerçekten verimli olmaktan çok uzak.
Bu sorunu bash kullanarak nasıl daha verimli çözersiniz?
(Eklenecek bir şey var: Perl veya awk'den çözülebileceğini biliyorum, bash'da daha iyi bir çözümle ilgileniyorum, bu dillerde değil.)
İLAVE BİLGİ:
Kaynak dosyanın 5 GB ve algoritmayı çalıştıran makinede 4 GB olduğunu varsayalım. Yani sıralama etkili bir çözüm değildir, dosyayı bir kereden fazla okumaz.
Hashhtable benzeri çözümü beğendim - herkes bu çözümde iyileştirmeler yapabilir mi?
EK BİLGİ # 2:
Bazı insanlar, örneğin perl'de çok daha kolay olduğunda neden bash yaparken rahatsız edeyim diye sordu. Nedeni makinede bu perl benim için mevcut değildi yapmak zorundaydı. Alıştığım aletlerin çoğu olmadan özel olarak yapılmış bir linux makinesiydi. Ve bence bu ilginç bir problemdi.
Bu yüzden lütfen soruyu suçlamayın, hoşunuza gitmiyorsa görmezden gelin. :-)