Ordenar linhas em um arquivo em 2 chaves com texto variável

1

Eu sou um DBA e tenho a saída de um processo de geração de reorganização que me fornece DML no seguinte formato:

REORG TABLE SCHEMA.A some other options
REORG TABLE SCHEMA.B some other options
REORG TABLE SCHEMA.C some other options
REORG TABLE SCHEMA.D some other options
REORG INDEXES ALL FOR TABLE SCHEMA.A some other options
REORG INDEXES ALL FOR TABLE SCHEMA.B some other options
REORG INDEXES ALL FOR TABLE SCHEMA.C some other options
REORG INDEXES ALL FOR TABLE SCHEMA.D some other options
RUNSTATS ON TABLE SCHEMA.A some other options
RUNSTATS ON TABLE SCHEMA.B some other options
RUNSTATS ON TABLE SCHEMA.C some other options
RUNSTATS ON TABLE SCHEMA.D some other options

Por razões que eu não vou aqui, eu preciso deste arquivo classificado na seguinte ordem (note que pode haver menos ou mais de 4 tabelas, ou menos ou mais de 3 entradas por tabela):

REORG TABLE SCHEMA.A
REORG INDEXES ALL FOR TABLE SCHEMA.A
RUNSTATS ON TABLE SCHEMA.A
REORG TABLE SCHEMA.B
REORG INDEXES ALL FOR TABLE SCHEMA.B
RUNSTATS ON TABLE SCHEMA.B
...etc

ie. REORG TABLES, REORG INDEX e RUNSTAT para cada tabela no arquivo.

Eu tentei o seguinte (mais variantes):

sort -t. -k2 test.fil
sort -t. -k2.1,2.8 -k1.1,1.7 test.fil

mas o problema parece estar recebendo a classificação secundária (REORG TABLE, REORG INDEX e RUNSTAT) funcionando corretamente.

O primeiro comando de classificação acima obtém os objetos na ordem do nome da tabela descendente, depois é classificado pelo comprimento de k2.

O segundo comando de classificação não leva em conta o fato de que TABLE vem depois de INDEX (T após I) no alfabeto, mas que eu preciso de INDEX depois da tabela.

Todos os gurus que podem ajudar, muito apreciados. Talvez haja outros comandos do awk e do linux para usar em conjunto?

Eu também passei pelas opções de comando de classificação, talvez haja algumas que eu perdi.

    
por dergy 12.07.2018 / 09:02

1 resposta

2

Vamos criar um script awk que modifique seus dados para que seja facilmente ordenado da maneira que você deseja que ele seja classificado:

BEGIN { OFS = "\t" } # set output delimiter to a tab

/REORG TABLE/ { $0 = 1 OFS $0 } # prefix line with 1 for this op.
/REORG INDEX/ { $0 = 2 OFS $0 } # with 2
/RUNSTATS/    { $0 = 3 OFS $0 } # with 3

# prefix line with schema name (unconditionally)
{ match($0,"SCHEMA\.[^ ]*"); $0 = substr($0,RSTART,RLENGTH) OFS $0 }

# output modified line
{ print }

Este script awk prefixaria cada linha com dois valores separados por tabulação:

  1. O nome do esquema, por ex. SCHEMA.A .
  2. A etapa em que esta operação acontece para este esquema, que é um inteiro, 1, 2 ou 3.

Executando em seus dados:

$ awk -f script.awk file
SCHEMA.A        1       REORG TABLE SCHEMA.A some other options
SCHEMA.B        1       REORG TABLE SCHEMA.B some other options
SCHEMA.C        1       REORG TABLE SCHEMA.C some other options
SCHEMA.D        1       REORG TABLE SCHEMA.D some other options
SCHEMA.A        2       REORG INDEXES ALL FOR TABLE SCHEMA.A some other options
SCHEMA.B        2       REORG INDEXES ALL FOR TABLE SCHEMA.B some other options
SCHEMA.C        2       REORG INDEXES ALL FOR TABLE SCHEMA.C some other options
SCHEMA.D        2       REORG INDEXES ALL FOR TABLE SCHEMA.D some other options
SCHEMA.A        3       RUNSTATS ON TABLE SCHEMA.A some other options
SCHEMA.B        3       RUNSTATS ON TABLE SCHEMA.B some other options
SCHEMA.C        3       RUNSTATS ON TABLE SCHEMA.C some other options
SCHEMA.D        3       RUNSTATS ON TABLE SCHEMA.D some other options

O que isso faz é facilitar a localização das chaves de classificação para sort .

Isso pode ser classificado e as novas colunas podem ser excluídas:

$ awk -f script.awk file | sort | cut -f 3-
REORG TABLE SCHEMA.A some other options
REORG INDEXES ALL FOR TABLE SCHEMA.A some other options
RUNSTATS ON TABLE SCHEMA.A some other options
REORG TABLE SCHEMA.B some other options
REORG INDEXES ALL FOR TABLE SCHEMA.B some other options
RUNSTATS ON TABLE SCHEMA.B some other options
REORG TABLE SCHEMA.C some other options
REORG INDEXES ALL FOR TABLE SCHEMA.C some other options
RUNSTATS ON TABLE SCHEMA.C some other options
REORG TABLE SCHEMA.D some other options
REORG INDEXES ALL FOR TABLE SCHEMA.D some other options
RUNSTATS ON TABLE SCHEMA.D some other options
    
por 12.07.2018 / 09:16

Tags