One way of doing this, is to use a window function and partition by geometry, so that each repeated geometry gets an id: 1, 2, 3, etc (or 1, 2) in your case, and then you just select from the table where the id = 1, to get a unique set of values (attributes and geometry) back, eg,
WITH unique_geoms (id, geom) as
(SELECT row_number() OVER (PARTITION BY geom) as id, geom FROM some_table)
Obviously, you would need to add the other osm columns in the select too, this is just for illustration, but this is basically like grouping by geometry and just selecting the first instance of each one.
As all the other attributes are presumably the same for each geometry pair, you would so something like this for all the other fields, including osm_id, and to actually create a new, unique table:
CREATE TABLE osm_unique AS
WITH unique_geoms (id, osm_id, attr1, attr2,... attrn, geom) as
(SELECT row_number() OVER (PARTITION BY geom) as id, osm_id, attr1, attr2,... attrn, geom
SELECT osm_id, attr1, attr2,... attrn, geom
This might be quicker than deleting from an existing table, especially if there are lots of indexes in place.
EDIT. As @dbaston has pointed out,
PARTITION BY geom uses the = operator, based on bounding boxes, so will eliminate geometries with shared borders. The above would be better written using
PARTITION BY ST_AsBinary(geom) instead, ie,
(SELECT row_number() OVER (PARTITION BY ST_AsBinary(geom)) as id, osm_id, attr1, attr2,... attrn, geom