shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Individualizar variáveis concatenadas [o barato que sai caro]


From: boxferrari
Subject: Individualizar variáveis concatenadas [o barato que sai caro]
Date: 30 Jul 2014 13:46:44 -0700

Salve guerreiros!

Estou ausente da lista faz uma era, devido a novos rumos profissionais. Entretanto, sempre sobra algo que o bom e velho shell pode fazer pela gente, mesmo quando não se é mais sysadmin. Será que ainda tem crédito na praça para receber uma ajudinha?

Tenho um arquivo .csv com várias colunas e exatas 2407 linhas. Em uma destas colunas há uma fórmula com o conteúdo parecido com a linha abaixo:

and(|CODVEND2|=146;|CODGER1|=135;|TIPOCOMISSAO|="AT";or(|CODVEND1|=6979;|CODVEND1|=174;|CODVEND1|=6069;|CODVEND1|=120;|CODVEND1|=5685;|CODVEND1|=136))


Notem que os ";" desta linha não são os separadores de colunas do arquivo, mas sim parte do conteúdo da tupla.


Notem também que o conteúdo acima é uma operação de comparação que (em SQL, por exemplo) seria lida mais ou menos assim:


<code>


(...)

where

    CODVEND2=146 and

    CODGER1=135 and

    TIPOCOMISSAO="AT" and

    (   

     (CODVEND1=6979) or

     (CODVEND1=174) or

     (CODVEND1=6069) or

     (CODVEND1=120) or

     (CODVEND1=5685) or

     (CODVEND1=136)

   )


</code>


O que eu preciso fazer usando shell é reescrever o conteúdo desta variável eliminado a condicional OR, ou seja, criando uma nova linha para cada ocorrência de CODVEND1 com um único teste desta variável. Preciso ter uma linha com o teste do valor 6979, outra linha testando o valor 174 e assim por diante (até testar os 6 valores possíveis para a variável CODVEND1).


O primeiro problema é que a quantidade de valores possíveis para CODVEND1 (no exemplo são 6) é variável, podendo ser 1, 2, 3, ..., n ou até mesmo nenhum.


Assim, o que eu gostaria é uma maneira de ler cada uma das 2407 linhas do arquivo e, para cada ocorrência da variável CODVEND1, replicar a linha acrescentando no fim dela o valor que sucede o sinal de "=" imediatamente após o texto |CODVEND1|.


Minha dificuldade NÃO está em localizar a ocorrência de CODVEND1, nem casar o valor atribuído a ele, muito menos em replicar a linha acrescentando tal valor ao final.


A questão é como montar o loop dentro de cada linha, que faça avance a cada nova ocorrência de CODVEND1 e que saida dela (indo para a próxima linha) quando não encontar mais nenhum CODVEND1 naquela linha.


O segundo problema é que nem sempre todos os CODVEND1 estão na sequência um do outro, podendo ocorrer um no ínício do texto e outro no final, com outras comparações entre eles.


Alguém pode me dar uma ideia de quais meios posso usar para fazer isso?


Abraço


Cristiano P. Ferrari


PS: para quem quizer saber o porquê do "barato sai caro" no título da mensagem, a razão é que o para economizar a repetição dos testes (um para cada variação no CODVEND1), no passado o estúpido teve a estapafúrdia ideia de agrupar os mesmos testes condicionais onde somente variava o CODVEND1, criando esse monde de OR. Agora, a quatindade de registros cresceu e o gerenciamento se tornou-se simplesmente impraticável e tenho que "desaninhar" para conseguir dar manutenção nas regras representadas por estes testes.





 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]