Script Para Formatação de Texto Com Cabeçalho, Rodapé e Campos de Dados Originados de Arquivo em AWK
Publicado por Perfil removido (última atualização em 31/07/2012)
[ Hits: 7.640 ]
Download 1343706392.format001.awk (versão 2)
Este script faz uma coisa relativamente simples:
- recebe um arquivo com linhas de texto;
- separa as primeiras linhas como uma espécie de cabeçalho, conforme recebidas;
- as linhas seguintes são agrupadas de n em n linhas numa única mesma linha;
- deixa as últimas linhas sem serem agrupadas, como um rodapé;
Deve ser habilitada a execução com "chmod +x ./format001.awk"
$ ./format001.awk -v header=nnn1 -v footer=nnn2 -v step=nnn3 <arquivo>
ou
$ ./format001.awk --assign=header=nnn1 --assign=header=footer=nnn2 --assign=header=step=nnn3 <arquivo>
Onde:
- header: quantidade de primeiras linhas chamadas aqui como cabeçalho;
- footer: quantidade de últimas linhas chamadas aqui como rodapé;
- step: quantidade de linhas a serem unidas numa mesmo linha a cada vez;
Há possíveis variações, como não agrupar apenas as últimas linhas, apenas que não puderem completar o número de linhas máximo permitido numa linha criada na saída do programa.
Não consegui ainda descobrir como o script pode detectar que não há um arquivo de entrada. Se não houver nome de arquivo, ele entra em loop saindo apenas com Ctrl+C ou semelhante.
Porém há outra situação em que a entrada não possui um nome de arquivo e que o script recebe via pipe "|", por exemplo.
Nos dois casos, redirecionamento e estar sem nome de arquivo de entrada mesmo, o AWK interpreta o nome do arquivo de entrada como o caractere "-".
Como saber em qual caso "-" é um pipe e em qual caso é uma falha?
Fora isto talvez haja um caso ou outro não-previsto de falha na passagem de parâmetros sem tratamento de erro pelo script.
Versão 2 - Enviado por euteste da silva em 31/07/2012
Changelog: Modificações na entrada de dados e no if(!$0)
Download 1343706392.format001.awk
#!/usr/bin/awk -f
################################################################################
#
# Deve ser habilitada a execucao com "chmod +x ./format001.awk"
# O nome do programa deve ser alterado no codigo em caso de ser renomeado.
#
# Uso:
#
# $ ./format001.awk -v header=nnn1 -v footer=nnn2 -v step=nnn3 <arquivo>
# ou $ ./format001.awk --assign=header=nnn1 --assign=header=footer=nnn2 --assign=header=step=nnn3 <arquivo>
#
# -v eh opcao para passar valores a variaveis de script por linha de comando
# --assign eh equivalente a opcao -v
#
# * header eh o numero de linhas de cabecalho
# * footer eh o numero de linhas de rodape
# * step eh o numero de linhas a ser escrito como unica linha antes de uma quebra de linha
#
# nnn1, nnn2, nnn3 sao valores numericos diferentes a serem passados
# <arquivo> eh o arquivo a ser formatado pelo script
#
# Em caso de omissao de um dos valores, o dafault eh 0.
#
#
#
################################################################################
BEGIN {
if (header=="") header = 0;
if (footer=="") footer = 0;
if (step=="") step = 0;
h_=header;
f_=footer;
s_=step;
gsub(/[[:digit:]]/,"",h_);
gsub(/[[:digit:]]/,"",f_);
gsub(/[[:digit:]]/,"",s_);
if (h_ || f_ || s_) {
print "\n\tErro: uma das variaveis eh negativa ou eh um numero.\n\n\tUso:\n\n\
$ ./format001.awk -v header=nnn1 -v footer=nnn2 -v step=nnn3 <arquivo>\n\
ou $ ./format001.awk --assign=header=nnn1 --assign=footer=nnn2 --assign=step=nnn3 <arquivo>\n\n\
-v eh opcao para passar valores a variaveis de script por linha de comando\n\
--assign eh equivalente a opcao -v\n\n\
* header eh o numero de linhas de cabecalho\n\
* footer eh o numero de linhas de rodape\n\
* step eh o numero de linhas a ser escrito como unica linha antes de uma quebra de linha\n\n\
nnn1, nnn2, nnn3 sao valores numericos diferentes a serem passados\n\
<arquivo> eh o arquivo a ser formatado pelo script\n\n\
Em caso de omissao de um dos valores, o dafault eh 0.\n";
exit;
}
}
{
if (!$0) exit;
linhas[cont++]=$0;
}
END {
for(i=0;i<cont;i++){
printf ("%s",linhas[i]);
if (i<header || i>=cont-footer-1) printf ("%c","\n");
else {
if (step==0)
printf ("%c",(i<=cont-footer-1)?" ":"");
else
printf ("%c",(i-header)%step<step-1?" ":"\n");
}
}
}
Regressão linear usando Shell Bash + AWK
Mostrar as partições existentes no HD
Pesquisa de grupos do sistema por nome ou GID em AWK
Regressão linear usando Shell Bash + AWK
Mostrar as partições existentes no HD
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









