Carlo Ancelotti's Real overcame out-of-sorts city rivals Atletico Madrid 3-0 at the Bernabeu, while Gerardo Martino's Barca were 2-0 winners against Real Sociedad at the Nou Camp.
Atletico - the cup holders - had won twice in a row in north Madrid to sorely irritate their more successful neighbours, and Ancelotti's men used Wednesday's meeting to convincingly reassert their authority.
Cristiano Ronaldo would not score on his 29th birthday, while Gareth Bale was absent from the squad for unspecified reasons, but an own goal from Emiliano Insua and second-half efforts from Jese and Angel Di Maria gave Atletico a mountain to climb in next week's reverse at the Vicente Calderon.
In the second semi, Barca took a controversial lead through Sergio Busquets just before half-time and sealed victory in comedy fashion after the break.
Busquets rounded off a scrappy move with a neat finish to put Barca ahead - moments after Sociedad had had a decent penalty shout turned down when Carlos Vela appeared to be tugged down by Javier Mascherano. Inigo Martinez could not hide his frustration and was dismissed for dissent.
And the 10 men did not help themselves after the interval as Gorka Elustondo blasted an attempted clearance at helpless Sociedad goalkeeper Zubikarai, who inadvertently diverted the ball into his own net.