Use Card > Duplicates on Mac
I have been wrestling with this issue with very little success -- in fact, the my duplicates seemed to be multiplying -- however came across the following solution which required no additional software and was very easy.
It's important to understand that iCloud is the master here -- everything goes in and out of iCloud. So, if you add a new contact on your phone, it's synched to iCloud and then distributed to your other devices. Likewise if you delete a contact. So the process is -- get all devices to have the same set of contacts, dedupe on address book, then sync all devices together. Here's the step by step.
1) Turn off contacts on your iPhone, iPad and Mac (Settings - > icloud -> Contacts). Do this one device at a time. This will leave iCloud as your only contact database (it's a good idea to get a backup from Address book first, just in case)
2) Turn contacts back on in Address book and each device, one by one, and let them resolve. You'll probably end up with duplicates everywhere -- thats OK. At this point every device will be in sync with iCloud
3) Open address book and go to Card -> Duplicates from the main menu. This will merge all duplicates (based on name) on your address book into single contacts. (you may need to do this more than once just to ensure everything is caught). What you will find is that Address book ends up clean, with one copy of everything that it can match.
4) iCloud will automatically update with the normalized list. This should automatically push to your devices, however just to accelerate the process I plugged each device in and synched it via itunes.
VIOLA. One copy, of everything everywhere!