[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Programa em AWK para inserir tags em arquivo XML
From: |
Ronie Marcio M. C. Coelho |
Subject: |
Re: [shell-script] Programa em AWK para inserir tags em arquivo XML |
Date: |
Thu, 28 Mar 2013 11:42:51 -0300 |
Olá
Para casos assim eu uso o match do awk
Ex:
if ( match ($0,"<Cli ") )
{
print ”$0” ;
print “<Nova tag>xxxxx</Nova tag>”
} ...
Um outro exemplo; sei que abaixo de tal linha tem um item que procuro então
uso um getline extra para obte-lo:
Abaixo comparo duas linahs abixo da atual onde continha o texto esperado para
identificar quem tem maior valor
if ( match ($0,"texto a ser pesquisado") )
{
getline
A=zeros(trim(substr($0,10,3)),3)
getline
B=zeros(trim(substr($0,10,3)),3)
if (A<B)
{
print "maior"
}
}
Ronie Marcio M. C. Coelho
address@hidden
From: Wilton
Sent: Thursday, March 28, 2013 1:01 AM
To: address@hidden
Subject: [shell-script] Programa em AWK para inserir tags em arquivo XML
Ola, pessoal, boa noite.
Estou com um problema para resolver, que acredito ser bem desafiador. Gostaria
de um auxílio. Eu tenho que editar um extenso arquivo em XML incluindo tags em
alguns registros, que vou chamar de arquivo principal.Um exemplo deste arquivo
eu postei no pastebin (http://pastebin.com/KnY2rj1E) para melhor visualização.
O que devo fazer é inserir algumas operações(tag Op) abaixo de alguns
clientes(tag Cli). São muitas operações e muitos clientes.
Eu já tenho, em formato xml, as tags de clientes e operações que devo incluir
no arquivo principal.
A primeira ideia que tive foi criar um programa em awk que vai percorrendo cada
linha do arquivo principal imprimindo em outro arquivo, que chamarei de arquivo
final. Quando passasse por uma tag de cliente em que deve ser inserida alguma
operação, o programa imprimia a tag Cli e após imprimia o conteúdo do outro
arquivo que contém as operações que devem ser incluídas para esse cliente.
Nesse caso haveria um arquivo para cada cliente. Depois de incluídas essas
operações, o programa continuaria a imprimir as demais linhas até encontrar
outro cliente na mesma situação e realizar o procedimento novamente até o final
do arquivo principal.
O problema é que não sei como, ou se é possível, comandar no awk para inserir o
conteúdo de outro arquivo (que não seja o que ele está percorrendo, no caso, o
arquivo principal) para o arquivo final. Como se fosse possível fazer um "cat
ArquivoComOperacaoParaIncluir.xml >> ArquivoFinal.xml".
Até consegui implantar a ideia em Shel-Script, mas ficou muito lento:
# AdicionaTagOp.sh
# Programa para adicionar tags Operação abaixo de tags Clientes
ArquivoPrincipal=$1
cat $ArquivoPrincipal | while read LINHA #Para ir passando por cada linha do
arquivo principal, inserindo o conteúdo da linha na variável LINHA.
do
if echo $LINHA | grep '<Cli' > /dev/null
then
#A tag Cli já é adicionada no arquivo final
echo $LINHA >> arqFinal.xml;
#Cada arquivo com as operações adicionais teriam o nome igual à tag Cd do
cliente. O comando "egrep -o" faria o papel de extrair o conteudo da tag.
arqComOpAdic=`echo $LINHA | egrep -o 'Cd="[0-9]+"' | egrep -o '[0-9]+'`;
#Caso o arquivo com as operações a serem adicionadas exista, o conteúdo do
arquivo será adicionado no arquivo final. Caso não, o comado cat vai dar erro
que será direcionado para a pasta /dev/null. Essa parte que não sei como fazer
usando o AWK.
cat $arqComOpAdic 2> /dev/null >> arqFinal.xml;
else
#As outras tags vão sendo adicionadas no arquivo final.
echo $LINHA >> arqFinal.xml;
fi
done
(Fica melhor de visualizar no pastebin: http://pastebin.com/dirQ4JV7).
É isso, pessoal. Agradeço por qualquer sugestão. Acredito que se for possível
implementar no AWK seria muito mais rápido.
[As partes desta mensagem que não continham texto foram removidas]