Mostrando postagens com marcador awk. Mostrar todas as postagens
Mostrando postagens com marcador awk. Mostrar todas as postagens

quinta-feira, 29 de dezembro de 2016

AWK - Decimal Point is Comma - Ponto Decimal como Virgula

Dica retirada do manual GNU AWK:

$ export POSIXLY_CORRECT=1                        Force POSIX behavior
$ gawk 'BEGIN { printf "%g\n", 3.1415927 }'
-| 3.14159
$ LC_ALL=en_DK.utf-8 gawk 'BEGIN { printf "%g\n", 3.1415927 }'
-| 3,14159
$ echo 4,321 | gawk '{ print $1 + 1 }'
-| 5
$ echo 4,321 | LC_ALL=en_DK.utf-8 gawk '{ print $1 + 1 }'
-| 5,321


quarta-feira, 22 de julho de 2015

Right / Left Stings no AWK

Como no AWK não existem as impelemntações de Substring Right e Left, aqui vão duas funções que podem ser usadas:

function right(s,i) { return substr(s, 1+length(s)-i) }
function left(s,i) { return substr(s, 1, i) }



terça-feira, 3 de março de 2015

For + Awk - Parte 2

Problema: Dado um diretório, contendo diversos subdiretórios, que por sua vez contém diversos arquivos compactados e você precisa descompactar os arquivos de alguns destes diretórios.

Alternativa de solução: Vasculhar todos os diretórios, selecionando apenas os subdiretórios que interessam através, por exemplo de um awk.

Exemplo:

for k in $(for i in $(find /dados/ -type d);do for j in $(ls $i/*.gz); do echo $j | awk 'BEGIN{FS="/"}{if ($7 >= "20150106" && $7 <= "20150115"){print $0;}}' ;done; done); do gzip -dc $k; done | gzip > /dados/arquivo_20150106_20150115.txt.gz

Neste exemplo, eu vasculho todos os subdiretórios cujo nome esteja entre 20150106 e 20150115, descompacto estes arquivos e os compacto em uma nova saída.



quarta-feira, 21 de janeiro de 2015

Ceiling no AWK

Me ajudou muito !!!

function ceiling(x) { return (x == int(x)) ? x : int(x)+1 }

quinta-feira, 27 de novembro de 2014

TRIM no AWK

Subfuncções TRIM para AWK

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }

Exemplo:

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN{OFS=";"}
{
print substr($0,466,32), substr($0,17,3), substr($0,191,3), substr($0,194,2), substr($0,187,2), substr($0,189,2), trim(substr($0,48,10)), substr($0,455,11), substr($0,177,5), substr($0,182,5), trim(substr($0,58,20)), trim(substr($0,98,32)), substr($0,500,3);
}

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 !!

sexta-feira, 14 de junho de 2013

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; }}' 

quinta-feira, 28 de junho de 2012

Shell - renomear vários arquivos

Em ambiente Unix-like, para renomear vários arquivos uma boa dica é usar o comando script for com awk.

Sintaxe:
for i in (ls <máscara_arquivos>); do echo $i  | awk '{a=$0; b=a; gsub(".txt",".pl",b); print "mv " a " "b;}' | bash; done

Exemplo:

for i in $(ls *.txt); do echo $i | awk '{a=$0; b=a; gsub(".txt",".pl",b); print "mv " a " "b;}' | bash; done

sexta-feira, 13 de abril de 2012

Bash FOR + AWK

Esses tempos me deparei com a necessidade de concatenar diversos arquivos de um diretório, com base em um filtro, que estavam, originalmente, compactados, adicionando ao ínicio da linha um sequencial e ao fim da linha o nome do arquivo de origem e número da linha neste arquivo.

Para isso usei:

for i in $(ls arquivos/*.gz); do gzip -dc $i > $i.temp; awk 'substr($0, 34,6)=="201111"{print $0 "|" FILENAME "|" NR}' $i.temp;rm $i.temp; done | awk 'BEGIN{c=1}{printf ("%010d%s\n", c++, $0)}' > arquivo_concatenado.txt

Onde:
for i in $(ls arquivos/*.gz) #itens de (ls arquivos/*.gz) para a variavel i
do #início do laço
gzip -dc $i > $i.temp; #descompacta o arquivo para nomedoarquivo.temp
awk 'substr($0, 34,6)=="201111"{print $0 "|" FILENAME "|" NR}' $i.temp; #com o awk filtra-se a linhas onde o substring atenda a condição desejada (substr($0, 34,6)=="201111") e imprime-se o conteúdo da linha + pipe + NOME DO ARQUIVO + pipe + NUMERO DA LINHA
rm $i.temp; #remove o arquivo temporario criado na descompactação
done < fim do laço

[]'s

quinta-feira, 22 de março de 2012

Linux - MySQL e AWK facilitam sua vida

Podemos usar comandos bash (script), awk e mysql juntos para de modo a facilitar o dia-a-dia do usuário.
Comandos bash, mysql e awk podem ser concatenados através de pipe '|'. Abaixo alguns exemplos:

- Efetuar o 'dump' de algumas tabelas de um banco de dados:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql

1) Cria um 'comando-mysql' usando o comando echo (bash), que irá gerar uma lista de todas as tabelas iniciadas por abobrinha
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


2) O alias mysqlrk chama o mysql usando o comando gerado pelo bash:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


3) O resultado do mysql (relação de tabelas) é passado para o awk, que apenas imprime linha a linha (na verdade, este comando não se faz necessário, mas eu o coloquei como uma forma ilustrativa do que pode ser feito:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


4) A saída do awk é então enviada ao comando mysqldump que gera um dump das tabelas informadas, direcionando estas informações para o arquivo indicado:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql



- Excluir tabelas de um banco de dados:

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log


1) Cria um 'comando-mysql' usando o comando echo (bash), que irá gerar uma lista de todas as tabelas iniciadas por abobrinha e terminada por old
echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log

2) O alias mysqlrk chama o mysql usando o comando gerado pelo bash:

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log



3) O resultado do mysql (relação de tabelas) é passado para o awk, que concatena a cada nome de tabela a instrução de exclusão da tabela (drop table):

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}'mysqlrk -q --verbose --verbose > mysql.log



4) A saída do awk é então enviada ao alias mysqldrk que executa as instruções recebidas, e grava o log no arquivo de log

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log