I can't think of a pre-made library to do this all directly, and with such a low "resolution", you probably want precise control over how wide each column is etc.
You can basically treat your display like a very low resolution image, (e.g. a
char screen) then write that out each update, or you can just print the chars directly using something like ncurses or platform specific APIs to specify position. Or fake the whole thing displaying it like a tile-array with images that happen to look like ASCII/Extended-ASCII using one of many 2D graphics libraries/APIs.
Starting with some basic things like a single single column, row, etc. You can then build up from there, like you could for other graphics. The borders for a two column layout like that might be:
// make BUFFER_WIDTH, BUFFER_HEIGHT variable if want to support any sized console/terminal
int panel_height = BUFFER_HEIGHT - 2 /*pad*/ - 2 /*borders*/;
int border_bottom_y = panel_height + 2;
int right_width = 30;
int left_x = 2;
int left_width = BUFFER_WIDTH - right_width - 2 /*pad*/ - 3 /*outer and inner line*/;
int border_middle_x = left_x + left_width;
int right_x = border_middle_x + 1;
int border_right_x = right_x + right_width;
draw_cell(1, 1, 201); // (x, y, char)
draw_row(left_x, 1, left_width, 205); // (x, y, width, char)
draw_cell(border_middle_x, 1, 203);
draw_row(right_x, 1, right_width, 205);
draw_cell(border_right_x, 1, 187);
draw_col(1, 2, panel_height, 186); // (x, y, height, char)
draw_col(border_middle_x, 2, panel_height, 186);
draw_col(border_right_x, 2, panel_height, 186);
draw_cell(1, border_bottom_y, 200);
draw_row(left_x, border_bottom_y, left_width, 205);
draw_cell(border_middle_x, border_bottom_y, 202);
draw_row(right_x, border_bottom_y, right_width, 205);
draw_cell(border_right_x, border_bottom_y, 188);
Which you can then re-factor into a reusable
left_right_panels function/class, along with functions/properties to get the coordinates and size of the left and right panel for further drawing within them.
As you build up these functions, there will be less individual values you are having to work out manually, potentially just the key ones (like "I want the right panel to be 30 columns, and the left to be everything else").
You can also of course extend the functions to accept colour codes etc. And probably use named constants for the ASCII "graphics" characters.