quarta-feira, 26 de junho de 2013

Validar Quantidade de Campos(Colunas) em Arquivo Delimitado

Script AWK para verificar se um determinado arquivo possui a quantidade de colunas esperada

cat <arquivo> | awk 'BEGIN{FS="<separador>"};NF!=<nro_colunas> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<separador> - Separador (delimitador) de campos (colunas) do <arquivo>
<nro_colunas> - Número de campos (colunas) esperado no arquivo

Exemplo;

cat teste.csv |  awk 'BEGIN{FS=";"};NF!=10 {print "linha", NR, "colunas", NF , $0}' 

No exemplo acima, será (ão) direcionadas a saída padrão (tela)  a(s) linha(s) que não tiver(em) 10 colunas, informando a quantidade de colunas encontrada.

Para arquivos posicionais (sem delimitadores), a sintaxe fica:

cat <arquivo> | awk 'BEGIN{FS=""};NF!=<tam_reg> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<tam_reg> - Tamanho da Linha

terça-feira, 25 de junho de 2013

Executar Processos em Paralelo com termino Sincrono

Situação 1
Para executar vários processos em paralelo e ao final de todos executar um processo final, pode-se utilizar a instrução bash wait

Sintaxe
wait

Exemplo:
#!/bin/sh
./pgm1 &
echo "Pgm1 em execucao"
./pgm2 &
echo "Pgm2 em execucao"
wait
echo "Termino de ambos os processos"



Situação 2
Executar em paralelo vários processos, com base em um diretório de entrada e ao final de todos os processos, executar um novo processo. Para esta situação, pode-se recorrer a utilização de um pequeno script awk, além de um artifício de criar um arquivo ao final de todos os processos com a instrução bash wait.

Exemplo de script:

#!/bin/sh
DIR_ENTRADA=${1}
rm -fr "processo.ok"
ARQ_LOG_PROGRAMA="${PWD}/script.log"
DATA_EXEC=$(date "+%x-%X")
echo " " > ${ARQ_LOG_PROGRAMA}
echo "1) ${DATA_EXEC} -> Inicio da execucao" >> ${ARQ_LOG_PROGRAMA}

ls ${DIR_ENTRADA} | awk -v e=${DIR_ENTRADA} -v l=${ARQ_LOG_PROGRAMA} '{print ".programa " e "/" $0 ".txt >> " l " & "} END { print "wait;echo ok > processo.ok"}' | bash

while [ ! -f "processo.ok" ]; do
echo "Processando..." >> ${ARQ_LOG_PROGRAMA}
sleep 10
done

DATA_EXEC=$(date "+%x-%X")
echo "2) ${DATA_EXEC} -> Processamento em paralelo encerrado. Início do processo consolidador." >> ${ARQ_LOG_PROGRAMA}
./consolidador.sh

DATA_EXEC=$(date "+%x-%X")
echo "3) ${DATA_EXEC} -> Termino do Processamento" >> ${ARQ_LOG_PROGRAMA}

Agradecimentos a: Jorge Amorim e Leonardo Rombesso !

Remoção de NEWLINE no meio de arquivo

Script AWK para remover caracteres 'newline' do meio de uma linha, a partir de um arquivo compactado e gerando um novo arquivo compactado:

gzip -dc arquivo.Z | awk -F'^' 'BEGIN{c=1}$0!=""{printf("%s",$0); if(NF+c>=243){printf("\n");c=1}else{c=NF}}' | gzip > arquivosaida.txt.gz

Versão em Perl

gzip -dc arquivo.Z | perl -e '$c=1;while(<STDIN>){$_=~s/\r|\n//g; if($_!=""){ @a = split("\\^", $_); print $_; if(($#a)+$c>=243){print "\n";$c=1}else{$c=$#a+1} }}' | gzip > arquivosaida.txt.gz


Agradecimentos ao sempre presente (nerd) Jorge Amorim !!

quinta-feira, 20 de junho de 2013

MySQl - Sessões

Para visualizar as sessões no MySQL, usar o comando SHOW PROCESSLIST

Sintaxe;

SHOW [FULL] PROCESSLIST

Para deletar algum processo, usar o comando KILL

Sintaxe:

kill <nro_processo>;

Exemplo:

kill 1;

sexta-feira, 14 de junho de 2013

Oracle - SQL Plus - Tabs

A ferramenta SQL*Plus da Oracle tem por default, substituir diversos espaços/brancos (spaces) de um resultado de uma query por tabs (\t) vide http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm#i2683445

"SET TAB {ON | OFF}
Determines how SQL*Plus formats white space in terminal output. OFF uses spaces to format white space in the output. ON uses the TAB character. TAB settings are every eight characters. The default value for TAB is system dependent."

Para desativar isto, deve-se colocar antes da execução do SELECT a opção SET TAB OFF

Para outros parâmetros do SQL*Plus, consulte  SET System Variable Summary (http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm)

AWK - Checa tamanho de linha

Utilitário AWK para verificar o tamanho das linhas de um arquivo, imprimindo o número da linha(registro) e o tamanho, toda vez que ocorre uma mudança:

awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' <arquivo>

Exemplos:

awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' teste.txt

cat teste.txt | awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' 

Programa C - Compilação de Programas via prompt

Para compilar programas 'C' em distribuições Fedora/CentOs (ou outras) usando o compilador/linkeditor gcc (GNU Compiler Collection, http://gcc.gnu.org/) utilizar, preferencialmente, a seguinte sintaxe:

gcc -Wall -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -o teste teste.c

Caso o programa use a biblioteca Math.h, incluir o parâmetro -lm para linkeditar com esta biblioteca:

gcc -Wall -lm -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -lm -o teste teste.c

Outros parâmetros comuns:
-c : Apenas compila o programa, mas não faz a linkedição. Para linkeditar então deve-se chamar novamente o gcc, passando com a seguinte sintaxe:
gcc -o <executavel> <objeto>

exemplo:
1) Compilação
gcc -c -o teste.o teste.c

2) Linkedição
gcc -o teste teste.o

-glevel (normalmente -g3): Inclui informação completa de Debug, para uso com o GDB (GNU Debugger (http://www.gnu.org/software/gdb/)




Programa C - Utilização da Biblioteca Math

Em distribuições Fedora/CentOs, quando se quer utilizar a biblioteca MATH (math.h / libm) em programas "C", por algum motivo o linkeditor normalmente não encontra esta biblioteca por default. Neste caso, é necessário informar ao compilador no momento da compilação para utilizá-la:

gcc -o <executavel> -lm <fonte>

Exemplo:

gcc -o teste -lm teste.c

Quando usando a IDE do Eclipse, deve-se entrar nas propriedades do projeto (ALT-ENTER), ir na opção C/C++ Build, seção Settings, GCC C Linker, Libraries, incluir a Library (-l) m.