In a semi-final that had the tournament's top three run-getters all playing in the same game, Prithvi Shaw's blazing century won the day for Mumbai against Karnataka. Shaw, captaining Mumbai for only the third time, made 165 off 122 balls, incredibly enough, his lowest score as captain.

In his first match leading Mumbai, he had hit a tournament record 227* against Puducherry, and he followed that up with 185* in the quarter-final against Saurashtra.

Shaw's innings set Karnataka 323, a target that they might have backed themselves to get given how well their own openers - Devdutt Padikkal and R Samarth - had been going. While Samarth fell cheaply, Padikkal threatened to hit an unprecedented fifth List A century on the trot, before he was out for 64, after which Karnataka withered. Both men went past the record for most runs in a Vijay Hazare Trophy season, which was held by Mayank Agarwal who made 723 runs in 2017-18.

Shaw has 754 runs this season with a game in hand, while Padikkal's tally stopped at 737 runs. Samarth, who had a rare failure in the semi-final, stands fourth on the list with 613 runs.

Mumbai will face Uttar Pradesh in the final on March 14, after UP put in a clinical performance to go past Gujarat by five wickets in the second semi-final on Thursday.

Mumbai vs Karnataka

The game was a Shaw showcase from the start. He had missed out on a second double-century in the quarter-final when Mumbai reeled in the target with 8.1 overs to spare, but looked like he would achieve that in this game. He was eventually lbw to right-arm medium-pacer Vijaykumar Vyshak, who was playing his debut season, in the 41st over.

Shaw was brisk at the start and exploded once past his half-century. He was on 52 off 48 balls, but got to 152 in only 111 balls, reaching the landmark with a six off Ronit More. He took the lead in two substantial partnerships, putting on 71 (69 balls) for the second wicket with Aditya Tare, and then 159 for the third wicket (142 balls) with Shams Mulani, who had earned a surprising promotion to No.4. Mulani had batted only once above No.6 in ten previous List A innings, and while he made 45, it came off 71 balls. Shaw's pyrotechnics at the other end meant Mumbai were still rattling along at a good rate, but the innings lost some momentum when the captain was out.

Shivam Dube (27 off 24) and Aman Hakim Khan (25 off 18) - who made his debut in the previous match, the quarter-final against Saurashtra - did connect with a few blows, but Mumbai lost a cluster of wickets to be bowled out in 49.4 overs for 322. Vyshak was the most successful bowler, with 4 for 56, while Prasidh Krishna took 3 for 64.

With their openers in great form, and the likes of Manish Pandey and Karun Nair in the XI, the target wasn't as daunting for Karnataka as it might have been for any other team. For a while at the start of the chase, they did look like they were on course, but a double-strike by offspinner Tanush Kotian derailed the chase. Samarth had been castled by Dhawal Kulkarni in the second over, but Padikkal was in full flow, getting to his half-century in only 39 balls. He was forced to be more circumspect, however, when Kotian struck in the 13th and 15th overs, sending back KV Siddharth and Pandey. The body blow to Karnataka's chase came in the 20th over when Prashant Solanki bowled Padikkal for a run-a-ball 64. Although wicketkeeper BR Sharath smashed a 39-ball 61 down the order, the equation had become too steep for Karnataka.

Kotian, playing his second List A match, ended up with 2 for 23 in 10 overs.

Uttar Pradesh vs Gujarat

A collective performance with bat, ball and in the field saw UP end Gujarat's run in the tournament. Batting first after winning the toss, Gujarat's innings was in trouble early and never quite recovered. They could muster only 184, bowled out in 48.1 overs. Although UP had some wobbles of their own in the chase, they were mostly in control, and overhauled the target in 42.4 overs.

Gujarat's captain and centurion from their quarter-final Priyank Panchal was the first to fall, and UP kept chipping away at the Gujarat's top order to reduce them to 92 for 5 in the 26th over. Het Patel, who was Gujarat's most consistent batsman in the tournament, then stitched together a stand of 66 alongside Piyush Chawla, who negotiated his former team's attack with greater comfort than the top order had. That partnership apart, Gujarat's batsmen were kept in check.

Yash Dayal had figures of 3 for 34 while Aaqib Khan took 2 for 22 in ten overs, not giving the batsmen any room and employing changes of pace well. UP were also electric in the field, effecting three direct-hit run-outs. Het, who made 60 and whom Gujarat depended on to drag the total beyond 200, was also the victim of a direct hit, having tapped to mid-off and then run around the bowler.

Gujarat began their defence well, with Chintan Gaja getting both openers cheaply, but the bowlers didn't have the luxury of scoreboard pressure. UP were in a spot of bother at 45 for 3, but captain Karan Sharma combined with Akshdeep Nath to steer the team into safe territory.

The two put on 89 runs, and could afford to do it at a comfortable pace. Although Sharma was out when he was looking good for more, Nath carried on. He got to his half-century off 73 balls, having seen off an initially uncertain period. Nath fell for 71 with victory in sight, but with only 12 runs remaining to get and 9.2 overs to get them in, UP weren't in trouble.

Upendra Yadav, the Man of the Match in their quarter-final win against Delhi, finished things off in style with a six and a four.

Saurabh Somani is an assistant editor at ESPNcricinfo