Giả sử bạn có một tệp chứa địa chỉ IP, một địa chỉ trong mỗi dòng:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Bạn cần một tập lệnh shell tính cho mỗi địa chỉ IP bao nhiêu lần nó xuất hiện trong tệp. Đối với đầu vào trước, bạn cần đầu ra sau:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Một cách để làm điều này là:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Tuy nhiên, nó thực sự là xa hiệu quả.
Làm thế nào bạn sẽ giải quyết vấn đề này hiệu quả hơn bằng cách sử dụng bash?
(Một điều cần nói thêm: Tôi biết nó có thể được giải quyết từ perl hoặc awk, tôi quan tâm đến một giải pháp tốt hơn trong bash, không phải bằng các ngôn ngữ đó.)
THÔNG TIN BỔ SUNG:
Giả sử rằng tệp nguồn là 5 GB và máy chạy thuật toán có 4GB. Vì vậy, sắp xếp không phải là một giải pháp hiệu quả, cũng không đọc tệp nhiều hơn một lần.
Tôi thích giải pháp giống như hashtable - bất kỳ ai cũng có thể cung cấp các cải tiến cho giải pháp đó?
THÔNG TIN BỔ SUNG # 2:
Một số người hỏi tại sao tôi lại bận tâm làm điều đó trong bash khi nó dễ dàng hơn, ví dụ như perl. Lý do là trên máy tôi phải làm điều này không có sẵn cho tôi. Nó là một máy linux được xây dựng tùy chỉnh mà không có hầu hết các công cụ tôi đã sử dụng. Và tôi nghĩ đó là một vấn đề thú vị.
Vì vậy, xin vui lòng, đừng đổ lỗi cho câu hỏi, chỉ cần bỏ qua nó nếu bạn không thích nó. :-)