Если я понимаю, что вы хотите, вы хотите отсортировать по схеме db, чтобы вы могли обработать 1-7 файлов с помощью схемы CDS
, а затем 1-7 с помощью схемы CTL
. Вы можете сделать это, используя awk
split, чтобы изолировать db-schema, выводя всю запись, за которой следует db-schema, чтобы разрешить сортировку, а затем снова использовать awk
, чтобы удалить второй столбец сортировки db-schema, например
awk -F'-' '{split($2,a,"_"); print $0" "substr(a[5],1,3)}' listing |
sort -k2 |
awk '{print $1}'
Пример вывода
Если вы введете файл listing
, вы получите:
dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CDS.sql
dboption_02beforetablesize_20200710-092914_A_IS_CRB_CDS.sql
dboption_03create_table_20200710-092914_A_IS_CRB_CDS.sql
dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CDS.sh
dboption_05drop_table_20200710-092914_A_IS_CRB_CDS.sql
dboption_06aftertablesize_20200710-092914_A_IS_CRB_CDS.sql
dboption_07afterschemasize_20200710-092914_A_IS_CRB_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CTL.sql
dboption_02beforetablesize_20200710-092914_A_IS_CRB_CTL.sql
dboption_03create_table_20200710-092914_A_IS_CRB_CTL.sql
dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CTL.sh
dboption_05drop_table_20200710-092914_A_IS_CRB_CTL.sql
dboption_06aftertablesize_20200710-092914_A_IS_CRB_CTL.sql
dboption_07afterschemasize_20200710-092914_A_IS_CRB_CTL.sql
Сообщите мне, если вам нужны изменения к этому выходу.
Edit - Update Per-Format Change Delimiting dbname and schema with '-'
В комментариях, когда вы сообщили, что db-name и db-schema не были исправлены с помощью db-name, имеющее два разделителя '_'
и ни одного в db-schema, создавало проблему, когда то, что составляло db-name и что было db-schema, теперь было неоднозначным. Невозможно узнать, есть ли у вас трехчастное (два '_'
) имя и двухчастная (одна '_'
) схема или четырехчастное имя (три '_'
) и односоставная схема ( no '_'
) (или любые другие 6 или 7 комбинаций между 3-5 именами частей и схемой 1-3 частей).
Добавление '-'
в качестве разделителя между db-name и db -schema теперь предоставляет однозначный способ изолировать db-схему от имени файла независимо от количества частей, разделенных '_'
в db-name и db-schema. Вы можете использовать '-'
в качестве разделителя для awk
, и тогда $NF
станет последним полем. (схема базы данных плюс расширение). Затем, используя substr($NF, 1, match($1, /[.]/) - 1)
, вы можете изолировать только db-схему.
awk -F'-' '{ print $0" "substr($NF,1,match($NF,/[.]/)-1) }' listing |
sort -k2 |
awk '{print $1}'
Короткий пример ввода
$ cat listing
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
Пример использования / вывода
$ awk -F'-' '{ print $0" "substr($NF,1,match($NF,/[.]/)-1) }' listing |
> sort -k2 |
> awk '{print $1}'
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
Если вы хотите сохранить расширение как часть db-schema (я вижу, у вас есть расширения .sql
и .sh
), просто используйте следующее в качестве первого awk
command
awk -F'-' '{ print $0" "$NF }` listing
Дайте ему go с вашими обновленными именами и дайте мне знать, если есть какие-то икоты.
Дополнительная сортировка по DBSchema, затем DBName, затем FileNo.
Для сортировки по всем дополнительным параметрам, которые вы перечисляете, вам нужно будет изменить основной разделитель полей на что-то, что позволяет разделить каждое из полей и извлечь из полей информацию, необходимую для сортировки. Хорошим выбором будет просто использовать '-'
для разделения полей как:
Option fileno_stuff date time dbname dbschema
Это будет соответствовать примерной записи, например:
dboption-03create_table-20200710-092914-FOO_PDA-BAR_CDS.sql
Если вы сделаете те изменения в вашем листинге, затем вы можете добавить три столбца в свой листинг (например, fileno
, dbname
, dbschema
), что позволит вам затем sort -k4 -k3 -k2n
. Чтобы добавить поля и отсортировать новые данные, вы можете сделать:
awk -F'-' '{print $0" "substr($2,1,match($2,/[^0-9]+/)-1)+0" "$(NF-1)" "substr($NF,1,match($NF,/[.]/)-1)}' listing |
sort -k4 -k3 -k2n |
awk '{print $1}'
Пример входного списка
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDS.sql
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDT.sql
dboption-01beforeschemasize-20200710-092914_PDA-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDT.sql
dboption-02beforetablesize-20200710-092914_PDA-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDT.sql
dboption-03create_table-20200710-092914_PDA-CDS.sql
Сортированный результат
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDS.sql
dboption-01beforeschemasize-20200710-092914_PDA-CDS.sql
dboption-02beforetablesize-20200710-092914_PDA-CDS.sql
dboption-03create_table-20200710-092914_PDA-CDS.sql
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDT.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDT.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDT.sql
Когда у вас будет переформатированный листинг, попробуйте и дайте мне знать о любых проблемах.