[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