Как отсортировать DDL по названию объекта - PullRequest
0 голосов
/ 28 января 2020

Я хочу отсортировать сгенерированный DDL базы данных по имени объекта. Например, у меня есть следующий DDL:

CREATE TABLE MyTable3 (
  col1 integer,
  col2 varchar(10)
);

CREATE TABLE MyTable1 (
  col1 integer
);

CREATE TABLE MyTable2 (
  col1 integer,
  col2 varchar(10),
  time timestamp
  time2 timestamp
);

И я хочу следующий вывод:

CREATE TABLE MyTable1 (
  col1 integer
);

CREATE TABLE MyTable2 (
  col1 integer,
  col2 varchar(10),
  time timestamp
);

CREATE TABLE MyTable3 (
  col1 integer,
  col2 varchar(10)
);

Я пытался с awk, но я не знаю, чтобы указать несколько строк: awk -F; '{print $ NB}'

Я обнаружил, что msort может быть решением, но этот пакет больше не поддерживается.

Как видите, каждый элемент может у меня разное количество строк, и я хочу отсортировать их по первой строке, содержащей имя объекта.

Какие еще варианты у меня есть, чтобы отсортировать документ по нескольким строкам и указанному c терминатору (точка с запятой).

1 Ответ

0 голосов
/ 28 января 2020

Можете ли вы попробовать ниже решение gawk. Решение, однако, предполагает, что имя таблицы находится в той же строке, что и CREATE TABLE.

awk '
BEGIN {
}
{
        if($0 ~  /CREATE TABLE/) {
                found = match($0, /CREATE TABLE (.*) \(/, ary);
                if(found != 0)
                {
                        tablename=ary[1];
                }
                oneDDL=$0;
        }
        else if($0 ~  /;/) {
                oneDDL=oneDDL"\n"$0;
                arr[tablename]=oneDDL;
        }
        else {
                oneDDL=oneDDL"\n"$0;
        }
}
END {
        asort(arr);
        for(i in arr) {
                print arr[i];
                print "\n";
        }
}' Input_File

Поместите tablename в массив arr в качестве индекса со значением в виде текста DDL oneDDL.

Сортировать массив. Затем распечатайте содержимое массива.

...