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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Remover, substituir e inserir chars em um arquivo.


From: jimmy
Subject: Re: [shell-script] Remover, substituir e inserir chars em um arquivo.
Date: Sun, 22 Jan 2012 12:04:47 -0200
User-agent: mutt-ng/devel-r804 (Linux)

On Sat, Jan 21, 2012 at 01:25:19PM -0200, Alysson Gonçalves de Azevedo wrote:
> Olá, jimmy, muito obrigado pela colaboração.
> 
> Todas os 3 exemplos seus funcionaram ok, porém o segundo eu não não achei
> referências sobre ela, então não sei se entendi corretamente.
> {s=(s)?s","$NF:$NF}
> 
> Como eu não achei nenhuma referencia sobre o comando, eu suponho que
> signifique o seguinte,
> se s=(s) então s","$NF senão $NF.
>
> É isso mesmo?
Sim, é isso mesmo. "pattern ? pattern : pattern" é o operador ternário e
funciona de forma igual a da linguagem  C. Há menções sobre ele tando no
man quanto no  info do gawk, sendo  que no info, há  uma explicação mais
detalhada e com mais exemplos do que o man:

    $ info gawk 'Conditional Exp'

> Outra coisa, o que exatamente é "s=(s)"?
É  a primeira  parte  do expressão  ternária. Ela  testa  se a  variável
escalar  "s" é  válida,  neste caso,  ser válida  significa  que já  foi
atribuído algo a ela.

> Eu  também  experimentei  trocar  o  "s"  por  outra  letra,  mas  não
> funcionou, então, esse "s" é de String, ao invés de uma variável?
Não, é exatamente a variável "s" usada para concatenar o último campo de
cada linha não comentada do arquivo.

Podemos trocar essa condição ternária por:

    if ( length(s) != 0 ) {
        s = s "," $NF
    }
    else {
        s = $NF
    }
 
> Mais uma vez, agradeço a todos pela ajuda.
> 
> Alysson Gonçalves de Azevedo
> (11) 8491-7730
> 
> 
> 
> Em 20 de janeiro de 2012 22:19, jimmy <address@hidden> escreveu:
> 
> > **
> >
> >
> > Saudações Alysson,
> >
> >
> > On Fri, Jan 20, 2012 at 06:16:07PM -0200, Alysson Gonçalves de Azevedo
> > wrote:
> > > Pessoal, boa tarde.
> > > Estava estudando aqui um pouquinho sobre awk, e cheguei no seguinte
> > > problema:
> > >
> > > $ cat -E tmp/arquivos.txt
> > > #/home/odin/shell/tmp/arquivo1.txt$
> > > #/home/odin/shell/tmp/arquivo2.txt$
> > > /home/odin/shell/tmp/arquivo3.txt$
> > > #/home/odin/shell/tmp/arquivo4.txt$
> > > /home/odin/shell/tmp/arquivo5.txt$
> > >
> > > o que eu quero é exibir isso tudo em 1 linha apenas, ignorando as linhas
> > > que começam com #, exibindo apenas o nome do arquivo e seperando-os por ;
> > > (obs, não é para ter ; no final do texto, apenas entre os nomes).
> > >
> > > eu consigo isso assim:
> > > $ awk -F'/' '! /#/ { print $NF }' tmp/arquivos.txt | awk '{if
> > > (NR==1){printf "%s",$0;}else{printf ";%s", $0;}}'
> > > arquivo3.txt;arquivo5.txt
> > >
> > > eu tentei fazer isso assim:
> > > $ awk -F'/' '! /#/ {if (NR==1){printf "%s",$NF;}else{printf ",%s",
> > $NF;}}'
> > > tmp/arquivos.txt
> > > ,arquivo3.txt,arquivo5.txt
> > >
> > > mas não funciona, pq pra ele, o NR==1 é a primeira linha, arquivo1.txt,
> > que
> > > está comentada.
> > >
> > > Alguém sabe me dar uma luz de como fazer a mesma coisa com apenas 1
> > > awk ?
> > Para não mudar muito seu código, você poderia apenas usar uma variável
> > auxiliar ao invés de NR:
> >
> > $ awk -F'/' '! /#/ {i++;if (i==1){printf "%s",$NF;}else{printf ",%s",
> > $NF;}}' arquivo.txt
> >
> > usei "i" como variável.
> >
> > Pode-se também concaternar tudo numa variável escalar e só imprimir ao
> > final ou mesmo armazenar num array para posterior manipulação. Exemplos:
> >
> > $ awk -F'/' '!/#/{s=(s)?s","$NF:$NF}END{print s}' arquivo.txt
> >
> > e
> >
> > $ awk -F'/' '!/#/{a[++i]=$NF}END{for(i in a){s=(i!=1)?",":"";printf
> > s""a[i]}}' arquivo.txt
> >
> >
> > > Desde já agradeço!!
> > >
> > > Alysson Gonçalves de Azevedo
> > > (11) 8491-7730
> >
> > []'s.
> > --
> > "Não manejo bem as palavras
> > Mas manipulo bem as strings."
> > ------------------------------
> > http://tecnoveneno.blogspot.com


reply via email to

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