A league phase that saw plenty of high points and close contests has left eight quarter-finalists to try and take one more step towards the Ranji Trophy 2019-20 title. Here's a quick look at each team.
Played 8, Won 5, Lost 0, Drawn 3 (1 first-innings lead); Points - 35
After beginning steadily, Gujarat's season took off with a stirring win over Punjab in their fourth game. They were 72 for 5 in the second innings, with the overall lead just 124, but the last five wickets added 95 runs, and the target of 220 proved beyond Punjab. The next games had Gujarat defeating defending champions Vidarbha in a close contest, taking a hard-fought first-innings lead against Delhi, and rounding things off with a win against Andhra.
Axar Patel has played only four matches in the season so far, but he's already taken 24 wickets. He also made an important 89 against Andhra.
The all-round talents of Roosh Kalaria have served Gujarat well across formats, particularly this season. In the Ranji Trophy so far, he's Gujarat's highest-wicket taker with 30 strikes. His batting average is a useful 16.25 too.
Played 8, Won 4, Lost 1, Drawn 3 (2 first-innings leads); Points - 32
Bengal had been good without being great in the first half of the season, but the surge came in their second half. A Manoj Tiwary triple-century led to an innings win over Hyderabad, rain robbed them of potential first-innings lead points at least against Delhi, and then they came from behind to win each of their last two games, against Rajasthan and Punjab. They chased down 320 against Rajasthan, and won a tense, low-scoring shootout against Punjab.
Manoj Tiwary was always going to be one of Bengal's go-to batsmen, but the sudden downturn of form for captain Abhimanyu Easwaran meant the responsibility on Tiwary was greater. He was scoring consistent runs, then exploded with that monumental 303*. He ended the league stage with two half-centuries on a dustbowl against Punjab.
Shahbaz Ahmed had played just two first-class matches before this season, but he turned out to be Bengal's surprise weapon; 29 wickets at an average of just 13.44 were already fantastic, but Shahbaz has also hit 281 runs at 31.22. One of his two half-centuries came in that chase against Rajasthan.
Played 8, Won 4, Lost 0, Drawn 4 (1 first-innings lead); Points - 31
Karnataka were expected to top the table, and would have done so if not for a couple of uneven performances. But they won the big moments. They came out on top in two thrilling games against two long-time rivals: Tamil Nadu and Mumbai. They also stepped on the gas when needed, with two wins in their last three league games.
Injury has meant K Gowtham has played only four games, but he's been a strong presence in each of those, with bat and ball. A batting average of 44.60 and a bowling average of 20.57 speak for themselves.
Devdutt Padikkal tapered off somewhat in the second half of the season, but he had begun with a bang, and is still the highest run-getter for Karnataka this season with 547 runs. That comes on the back of good form in the Vijay Hazare and Syed Mushtaq Ali Trophies.
Played 8, Won 3, Lost 1, Drawn 4 (4 first-innings leads); Points - 31
Saurashtra continued the form that took them to the final last year, with solid performances through the league phase. They might have finished higher on the table, but Madhya Pradesh held on for a draw with nine wickets down. Saurashtra's only blip came in a loss to Uttar Pradesh.
Jaydev Unadkat had what was till then his best Ranji season last year. This year, he's taken it a notch further. He's missed a game but still has 51 wickets, at an incredible average of 11.90 and equally stunning strike rate of 25. Unadkat has been the heartbeat of the bowling attack.
Cheteshwar Pujara has the best average among Saurashtra's batsmen, though that was perhaps only to be expected. However, with Pujara not available, it's Sheldon Jackson who has stepped up, much like he did last season too. Jackson is the leading run-getter for Saurashtra, and a lot of his runs have come at crucial times.
Played 8, Won 4, Lost 2, Drawn 2 (no first-innings leads); Points - 27
Andhra had a splendid campaign and were leading the combined A & B table for a large part until two consecutive losses at the end dented their position. However, thanks to the good work put in earlier, they still qualified comfortably enough.
Andhra served early notice of their form. In their opening-round game against defending champions Vidarbha, they battled back from conceding a 230-run first-innings lead to force a draw. In their next match, they beat Delhi by nine wickets, narrowly missing out on a bonus point. They had a run of four wins in five matches at one point.
Before this season, medium-pacer KV Sasikanth had made only sporadic appearances for Andhra. Now, he's indispensable to Andhra's plans. The leading wicket-taker with 35 scalps despite missing a game, he's also scored 203 runs at 22.55, becoming a useful lower-order batsman.
This has been the season that Ricky Bhui's talent has met with more consistent performances. Bhui is Andhra's leading run-getter, but more than the runs, it's the situations in which he's got them. He made 100* in the season opener against Vidarbha to help salvage a draw and his 144* in the next match against Delhi was the cornerstone of Andhra's win.
Jammu & Kashmir
Played 9, Won 6, Lost 1, Drawn 2 (1 first-innings lead); Points - 39
They came into this season on the back of unprecedented strife in the state. Even without that context, their performances on the field have been sensational, but given the larger picture, they have been even better. The only game they lost, to Haryana, was a two-wicket defeat. The best part about J&K's season has been how much of a team show it has been. They haven't relied on any one person significantly more than others. Four batsmen have over 400 runs (a fifth has 386). Five bowlers have more than 20 wickets. The entire team has showcased indomitable spirit.
Even in a team effort, you can't keep Parvez Rasool away from the limelight. He's got 403 runs, and his average of 44.77 is the highest in the team. He's also got 25 wickets at just 14.56. And he's done this despite missing four games.
The exciting young Abdul Samad had made a name for himself at the start of the season when he was picked up in the IPL auction. The rest of the season has shown why. That he has 547 runs is impressive enough - but stunningly, they have come at a strike rate of 116.13. His innings have been truly game changing. And he's found the time to turn his arm over and grab four wickets in 15 overs too.
Played 9, Won 5, Lost 2, Drawn 2 (1 first-innings lead); Points - 38
Odisha began their season with three consecutive bonus-point wins. They were a bit fortunate to get a draw against Tripura with two days and a session lost to rain. It could have marked a slide in fortunes, but the inflexion point was successfully passed in a heart-stopping one-wicket win against Haryana in the next match. Though they lost two of their last four matches, they had done enough to finish in the top two in Group C.
He's only 26 but Suryakant Pradhan is already a veteran for Odisha. He has never quite enjoyed a season as spectacular as this one, though. He's already the team's leading wicket-taker with 35 wickets, but he's also contributed 244 runs, including a manic 64 off 28 balls against Services, batting at No. 9.
Their ages - 33 and 19 - are possibly the only differentiators between Basant Mohanty and Rajesh Mohanty. Basant has 30 wickets at 18.90, Rajesh has 32 wickets at 18.43. Basant is more economical, Rajesh strikes quicker. Together they have given Odisha a pace edge that they lacked when Basant was operating solo.
Played 9, Won 7, Lost 0, Drawn 2 (1 first-innings lead); Points - 50
Relegated to the Plate Group last year, Goa are back to Group C after topping the Plate table this year. Goa were expected to get tough competition from only two teams - Chandigarh and Pondicherry - and they came through those tests well. Conceding a massive lead of 329 against Chandigarh, they dug in during the second innings to force a draw. They held off Pondicherry for a ten-run first-innings lead and then induced a late collapse to surge to victory on the final day.
Amit Verma has had the season of an allrounder's dreams. It would have been great as a batsman or bowler alone - 791 runs at an average of 71.90, and 41 wickets at 13.26. He's been Goa's highest run-getter and wicket-taker, and he's the captain too.
Smit Patel began the season relatively slowly, with 71 runs in his first three innings. Then he began reeling off the big scores without pause, ending the league stage with 751 runs at an average of 75.10.
Jammu and Kashmir
Saurashtra (and Kathiawar)
Karnataka (and Mysore)
Saurabh Somani is an assistant editor at ESPNcricinfo