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

[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]



reply via email to

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