สมมติว่าคุณมีไฟล์ที่มีที่อยู่ 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
วิธีหนึ่งในการทำเช่นนี้คือ:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
อย่างไรก็ตามมันอยู่ไกลจากการมีประสิทธิภาพ
คุณจะแก้ปัญหานี้อย่างมีประสิทธิภาพยิ่งขึ้นด้วยการใช้ bash ได้อย่างไร
(สิ่งหนึ่งที่เพิ่มเติม: ฉันรู้ว่ามันสามารถแก้ไขได้จาก perl หรือ awk ฉันสนใจวิธีที่ดีกว่าในการทุบตีไม่ใช่ในภาษาเหล่านั้น)
ข้อมูลเพิ่มเติม:
สมมติว่าไฟล์ต้นฉบับคือ 5GB และเครื่องที่ใช้อัลกอริทึมมี 4GB การเรียงลำดับจึงไม่ใช่โซลูชันที่มีประสิทธิภาพไม่อ่านไฟล์มากกว่าหนึ่งครั้ง
ฉันชอบโซลูชันที่เหมือน hashtable - ทุกคนสามารถให้การปรับปรุงโซลูชันนั้นได้หรือไม่
ข้อมูลเพิ่มเติม # 2:
บางคนถามว่าทำไมฉันถึงต้องทำอย่างนี้ด้วยวิธีทุบตีเมื่อมันง่ายขึ้นเช่นใน Perl เหตุผลก็คือในเครื่องที่ฉันต้องทำ Perl นี้ไม่สามารถใช้ได้สำหรับฉัน มันเป็นเครื่องลินุกซ์ที่สร้างขึ้นเองโดยไม่มีเครื่องมือส่วนใหญ่ที่ฉันคุ้นเคย และฉันคิดว่ามันเป็นปัญหาที่น่าสนใจ
ดังนั้นโปรดอย่าตำหนิคำถามเพียงเพิกเฉยถ้าคุณไม่ชอบ :-)