मान लें कि आपके पास एक फ़ाइल है जिसमें IP पते, प्रत्येक पंक्ति में एक पता है:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
आपको एक शेल स्क्रिप्ट की आवश्यकता है जो प्रत्येक आईपी पते के लिए मायने रखता है कि यह फ़ाइल में कितनी बार दिखाई देता है। पिछले इनपुट के लिए आपको निम्न आउटपुट की आवश्यकता है:
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
हालांकि यह वास्तव में कुशल होने से बहुत दूर है।
आप बैश का उपयोग करके इस समस्या को अधिक कुशलता से कैसे हल करेंगे?
(जोड़ने के लिए एक बात: मुझे पता है कि इसे पर्ल या ऑक से हल किया जा सकता है, मैं बैश में बेहतर समाधान में दिलचस्पी रखता हूं, उन भाषाओं में नहीं।)
अतिरिक्त जानकारी:
मान लीजिए कि स्रोत फ़ाइल 5GB है और एल्गोरिथ्म चलाने वाली मशीन में 4GB है। तो सॉर्ट एक कुशल समाधान नहीं है, न ही फाइल को एक से अधिक बार पढ़ना है।
मुझे हैशटेबल जैसा समाधान पसंद आया - कोई भी उस समाधान में सुधार प्रदान कर सकता है?
अतिरिक्त जानकारी # 2:
कुछ लोगों ने पूछा कि मैं इसे बैश में क्यों परेशान करूँगा जब यह आसान है जैसे कि पर्ल। कारण यह है कि जिस मशीन पर मुझे यह करना था, वह मेरे लिए उपलब्ध नहीं थी। यह एक कस्टम बिल्ट लाइनक्स मशीन थी, जिसके अधिकांश उपकरण मैं इस्तेमाल कर रहा था। और मुझे लगता है कि यह एक दिलचस्प समस्या थी।
तो कृपया, प्रश्न को दोष न दें, यदि आप इसे पसंद नहीं करते हैं तो बस इसे अनदेखा करें। :-)