Squeak.ru - шаблоны программирования

форматирование строк в одном файле

Я немного новичок в оболочке unix, у меня есть файл, как показано ниже

кот dbschema

                  TABLE_NAME                  | TABLE_SIZE_BEFORE_RANDOM_MB
----------------------------------------------+-----------------------------
 SEC_CDS_SS |                    0.125000

                  TABLE_NAME                  | TABLE_SIZE_AFTER_RANDOM_MB
----------------------------------------------+----------------------------
 SEC_CDS_SS |                   0.125000

 TABLE_NAME  | TABLE_SIZE_BEFORE_RANDOM_MB
-------------+-----------------------------
 CDS_EV|                   28.625000

 TABLE_NAME  | TABLE_SIZE_AFTER_RANDOM_MB
-------------+----------------------------
 CDS_EV |                   0.500000

Мне нужен вывод, как показано ниже, в том же файле, например

кот dbschema

 TABLE_NAME                  | TABLE_SIZE_BEFORE_RANDOM_MB            TABLE_SIZE_AFTER_RANDOM_MB
----------------------------------------------+-----------------------------
 SEC_CDS_SS                     0.125000                               0.125000
 CDS_EV                          28.625000                              0.500000

Труба так же должна быть удалена в аутфайле,

Я попытался сопоставить первый столбец

awk '$1!=p{if(p)print s; p=$1; s=$0; next}{sub(p,x); s=s $0} END{print s}' dbschema

также попробовал некоторые sed, чтобы объединить 2 строки столбца

awk 'ORS=(NR%2==0) ?"\n" :" "' dbschema

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

также это способ игнорировать эхо-строку при запуске файла sh ??

У меня есть строка в моем sh как

<<<<<<<<<<<<<<<<< TEST >>>>>>>>>>>>>>>>>>> (in sh files , this line should be ignored and proceed with further lines in that sh file )

Большое спасибо

23.06.2020

  • Большое спасибо, ребята, за помощь в формате, я обязательно отформатирую в следующем вопросе .. 23.06.2020
  • Любое решение вышеуказанного вопроса очень ценится, спасибо 23.06.2020
  • Какое отношение строка под I have some line in my sh as имеет к вашему входному файлу dbschema? Если это что-то, что может присутствовать в вашем вводе, включите его в свой образец ввода, не добавляйте его в качестве запоздалой мысли в другом месте вашего вопроса. И, пожалуйста, убедитесь, что образец ввода и ожидаемый вывод в вашем вопросе точно верен, включая макет, символы и значения - мне это кажется подозрительно случайным. 23.06.2020
  • Привет, Эд, это просто цикл while, и он не имеет ничего общего с основным вопросом. 23.06.2020
  • и да, ввод и вывод ожидаемы, за исключением того, что канал не должен быть их ожидаемым выводом, спасибо 23.06.2020
  • за исключением того, что канал не должен быть их в ожидаемом выводе. Но вы хотите, чтобы --+--- остался? Я бы вообще пропустил синтаксический анализ заголовков и использовал бы printf "HEADER STUFF\n" по мере необходимости. Затем ваша логика может сосредоточиться на захвате правильного значения для правильной позиции. Кроме того, вы уверены, что система генерации не может создать все данные для каждой TABLE_NAME в одной строке (в целом)? У большинства клиентов базы данных есть -w (ширина), которую вы можете установить на 10000 или что-то еще, поэтому нет ненужного переноса данных (не совсем то, что вы здесь показываете). Это значительно упростит вашу задачу. Удачи. 23.06.2020
  • Спасибо Shelter даже --+--- может и не нужен , думал красиво будет смотреться неважно . На самом деле то, что я делаю, - это получение размера таблицы до того, как я изменю DDL таблицы, и получение размера таблицы после изменения DDL, поэтому его нельзя взять из системы за один раз. Выполнение некоторой обработки между двумя командами, спасибо 23.06.2020

Ответы:


1

Это удовлетворяет вашим требованиям:

awk -F '|' 'BEGIN {header = 1;}
$2 ~ /BEFORE_RANDOM/ {before = 1; if (header) {printf("%s",$0);}}
$2 ~ /AFTER_RANDOM/ {if (header) {printf(" | %s\n",$2); header = 0;}}
/^-/ || /^ *$/ {next;}
$1 !~ /TABLE_NAME/ {
    table = $1;
    if (before) {size_before = $2; before = 0;}
    else {printf("%-30s %12.6f %12.6f\n",table,size_before,$2);}
}' dbschema
  • Выводит информацию заголовка один раз.
  • Не печатает строку -----+-----
  • Пропускает пустые строки и строки, начинающиеся с тире.
  • Печатает одну строку на таблицу, без разделителей вертикальной черты

Отредактированная версия для данных до и после в отдельных файлах:

Сохраните это как table-size-changes и chmod +x table-size-changes:

#!/usr/bin/awk -f

BEGIN {FS = "|";}

/^-/ || /^ *$/ {next;}

{gsub(/ /,"");}

# First file has the "before" info
FNR == NR && !len[2] && /TABLE_NAME/ {
    len[2] = length($2);
    hdr[1] = $1;
    hdr[2] = $2;
}

FNR == NR && /TABLE_NAME/ {next;}

FNR == NR {
    tbl[$1] = $2;
    if (length($1) > len[1]) {len[1] = length($1);}
}

# Second file has the "after" info
FNR < NR && !len[3] && /TABLE_NAME/ {
    len[3] = length($2);
    hdr[3] = $2;

    # print output header
    for (i = 1; i <= 3; i++) {
        printf("%s%" len[i] "s", pad, hdr[i]);
        pad = " | ";
    }
    printf("\n");
}

FNR < NR && /TABLE_NAME/ {next;}

FNR < NR {
    pad = "";
    for (i = 1; i <= 3; i++) {
        val[1] = $1; val[2] = tbl[$1]; val[3] = $2;
        printf("%s%" len[i] "s", pad, val[i]);
        pad = "   ";
    }
    printf("\n");
}

Если данные из вашего исходного вопроса разделены на два файла, и вы запустите приведенный выше скрипт, вы получите следующий вывод:

table-size-changes before.txt after.txt
TABLE_NAME | TABLE_SIZE_BEFORE_RANDOM_MB | TABLE_SIZE_AFTER_RANDOM_MB
SEC_CDS_SS                      0.125000                     0.125000
    CDS_EV                     28.625000                     0.500000
23.06.2020
  • Большое спасибо Билл, я попробую это, большое спасибо 25.06.2020
  • Привет, Билл, извините за дополнительные вопросы, можно ли сделать то же самое из 2 файлов. Я 25.06.2020
  • ТАБЛИЦА_ИМЯ | TABLE_SIZE_BEFORE_RANDOM_MB исходит из одного файла, а TABLE_NAME | TABLE_SIZE_AFTER_RANDOM_MB из другого файла, просто сопоставьте таблицу и получите детали, как указано выше, в каком-либо выходном файле ?? Возможен счет?? Спасибо 25.06.2020
  • Это работает невероятно, Билл, примите поклон от меня, Билл, большое спасибо, большое спасибо. 26.06.2020
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...