Linux Сортировка по разным столбцам в именах файлов - PullRequest
0 голосов
/ 10 июля 2020

Не могли бы вы помочь мне отсортировать имена файлов по паре условий?

ls -tr | grep ${DATE}* | sort -k1

        dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_02beforetablesize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_02beforetablesize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_03create_table_20200710-092914_A_IS_CRB_CDS.sql
        dboption_03create_table_20200710-092914_A_IS_CRB_CTL.sql
        dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CDS.sh
        dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CTL.sh
        dboption_05drop_table_20200710-092914_A_IS_CRB_CDS.sql
        dboption_05drop_table_20200710-092914_A_IS_CRB_CTL.sql
        dboption_06aftertablesize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_06aftertablesize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_07afterschemasize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_07afterschemasize_20200710-092914_A_IS_CRB_CTL.sql

Я хочу, чтобы результат был: база данных, схема, а затем номер файла

A_IS_CRB - ​​это db и CTL, CDS - это схема. (Он также может иметь разные имена баз данных)

Я хочу обработать все 7 файлов для одной базы данных по одной схеме, а затем продолжить работу с другими 7 файлами той же базы данных с другой схемой или другой базой данных с какой-либо схемой.

Я пробовал пару вещей:

    ls -tr | grep ${DATE}* | sort -k1
    ls -tr | grep ${DATE}* | sort -t $'_'  -k4 -k5 -k2,2
    ls -tr | grep ${DATE}* | grep "  awk -F'[0-9]_' '{print $NF}' |awk -F_ '{print $NF}' |sed 's/.sql//' |sed 's/.sh//' | sed 's/\_$//'| uniq"  (to grep schema)
    

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

 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

Ответы [ 3 ]

0 голосов
/ 10 июля 2020

Если я понимаю, что вы хотите, вы хотите отсортировать по схеме 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

Когда у вас будет переформатированный листинг, попробуйте и дайте мне знать о любых проблемах.

0 голосов
/ 10 июля 2020

Посмотрите на это:

 sort -t '-' -k2  list

Возможно, это хорошее решение для вас. Если хотите, позвоните мне.

0 голосов
/ 10 июля 2020

Я выделил имена файлов в две таблицы, а затем отобразил их в конце обработки

awk '$0 ~ /_CDS/{cds[$0]} $0 ~ /_CTL/{ ctl[$0]} END{for(i in cds){print i} for(ii in ctl){print ii}}'  your_file

Подскажите, подходит ли вам это решение.

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