Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

1. Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Edson Sales
eSales

(usa Ubuntu)

Enviado em 07/03/2019 - 13:54h

Pessoal, estou com um problema que está me tirando o sossego. Vi alguns tópicos aqui no fórum, mas não consegui aplicar ao meu caso.
Com um script, estou tentando apagar uma certa quantidade de linhas de um arquivo com o comando sed, endereçando pelo número da linha.

Para isso, filtro o arquivo com o comando cut, pra selecionar o campo que quero, e uso o grep pra selecionar linhas específicas de acordo com o conteúdo:

cut -d';' -f5 principal.txt | grep -n "[[:alpha:]]" | cut d':' -f1 > linhas.txt 


O código acima vai me retornar um arquivo com o número das linhas que quero apagar, ou seja, todas as linhas que contenham letras no campo selecionado. Então, no script, uso este arquivo em um loop:

for i in $(cat linhas.txt)
do sed -i "${i}d" principal.txt
done


Então depois disso tudo, nada acontece no arquivo, as linhas continuam no mesmo lugar.

Se alguém tiver alguma ideia do que está errado, por favor, me ajude!


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/03/2019 - 20:34h

eSales escreveu:
É o seguinte, o código abaixo:
cut -d';' -f5 principal.txt | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt 
gera um arquivo (linhas.txt) com os números das linhas que quero apagar do arquivo chamado principal.txt.
$ cat linhas.txt
4788
4789
4790
4791
4792
8441
28674
32322
32323
32324
52563
52564
...


Então após isso, utilizo o arquivo linhas.txt dentro de um loop pra apagar as linhas específicas do arquivo principal.txt, usando o sed e endereçando pelo número das linhas que estão contidas no arquivo linhas.txt:

for i in $(cat linhas.txt)
do sed -i "${i}d" principal.txt #primeiro caso fica assim: sed -i "4788d" principal.txt, e assim por diante.
done


Então nada acontece, as linhas do arquivo principal.txt após rodar o script continuam "intactas".

Marcelo Oliver, entendi toda a lógica de sua sugestão, porém nunca utilizei o awk. Vou pesquisar mais sobre ele e ver se ajuda no meu caso.

Abraços!

Boa noite ESales.
Segue uma pequena explicação:
cat arquivo.txt
123456;123456;14444;545543;Linha01;123456;123456
123456;123456;14444;545543;Linha02;123456;123456
123456;123456;14444;545543;Linha03;123456;123456
123456;123456;14444;545543;LinhaQuatro;123456;123456
123456;123456;14444;545543;Linha05;123456;123456
123456;123456;14444;545543;Linha06;123456;123456
123456;123456;14444;545543;linhaSete;123456;123456
123456;123456;14444;545543;Linha08;123456;123456
123456;123456;14444;545543;LinhaNOVE;123456;123456
123456;123456;14444;545543;Linha10;123456;123456

O comando:
awk -F";" '$5~/^[[:alpha:]]+$/ {printf "%s\n" ,$5}' arquivo.txt 

Busca em arquivo.txt, onde o campo 5 tem SOMENTE "^[[:alpha:]]"
-F";" => IFS, separador de campo
'$5~/^[[:alpha:]]+$ => $%=Campo 5, ^[[:alpha:]]{1,}$ => SOMENTE "^[[:alpha:]]", no minimo 1
{printf "%s\n" ,$5}' => imprime o campo 5
LinhaQuatro
linhaSete
LinhaNOVE
Com o comando:
awk -F";" '$5~/^[[:alpha:]]{1,}$/ {printf "%sd;" ,NR}' arquivo.txt
4d;7d;9d;

Temos o nº das linhas, já no formato do sed: "4d;7d;9d;"
NR é o numero da linha onde "casou" a REGEX
Finalizando:
linhas=$(awk -F";" '$5~/^[[:alpha:]]{1,}$/ {printf "%sd;" ,NR}' arquivo.txt)
sed -i "${linhas}" arquivo.txt

O "awk", substitui os três comandos abaixo:
cut -d';' -f5 principal.txt | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt 

É isso . . .

Abç.:
Marcelo Oliver

3. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 07/03/2019 - 14:11h

Para adiantar o expediente, poste o conteudo de linhas.txt





------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




4. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/03/2019 - 16:32h


eSales escreveu:

Pessoal estou com um problema que está me tirando o sossego. Vi alguns tópicos aqui no fórum, mas não consegui aplicar ao meu caso.
Com um script, estou tentando apagar uma certa quantidade de linhas de um arquivo com o comando sed, endereçando pelo número da linha.

Para isso, filtro o arquivo com o comando cut, pra selecionar o campo que quero, e uso o grep pra selecionar linhas específicas de acordo com o conteúdo:

cut -d';' -f5 | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt

O código acima vai me retornar um arquivo com o número das linhas que quero apagar, ou seja, todas as linhas que contenham letras no campo selecionado. Então, no script, uso este arquivo em um loop:

for i in $(cat linhas.txt)
do sed -i "${i}d" arquivo.txt
done

Então depois disso tudo, nada acontece no arquivo, as linhas continuam no mesmo lugar.

Se alguém tiver alguma ideia do que está errado, por favor, me ajude!

Boa tarde Esales.
Segue exemplo:
cat linhas.txt
Linha_01
Linha_02
Linha_03
Linha_04
Linha_05
Linha_06
Linha_07
Linha_08
Linha_09
Linha_10
Linha_11
Linha_12
Linha_13
Linha_14
Linha_15
#Buscando as linhas que quero apagar,
Linhas que terminam com: 2 4 6 8 ou 0
lines=$(awk '/[24680]$/ {printf "%sd;" ,NR}' linhas.txt)
echo $lines
2d;4d;6d;8d;10d;12d;14d;
sed "${lines}" linhas.txt Linha_01
Linha_03
Linha_05
Linha_07
Linha_09
Linha_11
Linha_13
Linha_15
sed -i "${lines}" linhas.txt Linha_01


Tudo junto:
awk 'BEGIN{printf "sed \""} /[24680]$/ {printf "%sd;" ,NR} END{printf "\" linhas.txt\n"}' linhas.txt|bash
Linha_01
Linha_03
Linha_05
Linha_07
Linha_09
Linha_11
Linha_13
Linha_15

#Alterando o arquivo:
awk 'BEGIN{printf "sed -i \""} /[24680]$/ {printf "%sd;" ,NR} END{printf "\" linhas.txt\n"}' linhas.txt|bash

É isso....
Att.:
Marcelo Oliver
OBS.:
Não Abandone o TóPICO!


5. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Edson Sales
eSales

(usa Ubuntu)

Enviado em 07/03/2019 - 19:24h

Mauriciodez escreveu:

Para adiantar o expediente, poste o conteudo de linhas.txt





------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------



É o seguinte, o código abaixo:
cut -d';' -f5 principal.txt | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt 
gera um arquivo (linhas.txt) com os números das linhas que quero apagar do arquivo chamado principal.txt.
$ cat linhas.txt
4788
4789
4790
4791
4792
8441
28674
32322
32323
32324
52563
52564
...


Então após isso, utilizo o arquivo linhas.txt dentro de um loop pra apagar as linhas específicas do arquivo principal.txt, usando o sed e endereçando pelo número das linhas que estão contidas no arquivo linhas.txt:

for i in $(cat linhas.txt)
do sed -i "${i}d" principal.txt #primeiro caso fica assim: sed -i "4788d" principal.txt, e assim por diante.
done


Então nada acontece, as linhas do arquivo principal.txt após rodar o script continuam "intactas".

Marcelo Oliver, entendi toda a lógica de sua sugestão, porém nunca utilizei o awk. Vou pesquisar mais sobre ele e ver se ajuda no meu caso.

Abraços!







6. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Edson Sales
eSales

(usa Ubuntu)

Enviado em 07/03/2019 - 20:45h

Boa noite, Marcelo Oliver!
Vou estudar direitinho sua última sugestão. Assim que tiver algum resultado volto aqui pra informar.

Abraços!


7. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 07/03/2019 - 20:46h

tenta assim, coloque um espaço entre a variável e o "d" no sed.

for x in `cat linhas.txt`
do
sed -i "$x d" principal.txt
done



------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




8. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Edson Sales
eSales

(usa Ubuntu)

Enviado em 08/03/2019 - 00:10h

Mauriciodez escreveu:

tenta assim, coloque um espaço entre a variável e o "d" no sed.

for x in `cat linhas.txt`
do
sed -i "$x d" principal.txt
done



------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------



Então, cara, já tentei dessa forma e nada.
Era pra ser uma coisa simples, mas... tá bem complicado!


9. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 08/03/2019 - 09:14h


eSales escreveu:
Então, cara, já tentei dessa forma e nada.


aqui funcionou
mauricio@phantom ~ $ cat linhas.txt
1
1
1
1
1
mauricio@phantom ~ $ cat principal.txt
Linha 1
Linha 2
Linha 3
Linha 4
Linha 5
Linha 6
mauricio@phantom ~ $ for x in `cat linhas.txt`;do sed -i "$x d" principal.txt;done
mauricio@phantom ~ $ cat principal.txt
Linha 6
mauricio@phantom ~ $


------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------




10. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/03/2019 - 18:44h


eSales escreveu:

Mauriciodez escreveu:

tenta assim, coloque um espaço entre a variável e o "d" no sed.

for x in `cat linhas.txt`
do
sed -i "$x d" principal.txt
done



------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------



Então, cara, já tentei dessa forma e nada.
Era pra ser uma coisa simples, mas... tá bem complicado!


E Sales, boa noite.
Coloque ao nome da var entre {}:
for x in `cat linhas.txt`;do 
sed -i "${x}d" principal.txt
done




11. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 08/03/2019 - 22:09h

msoliver escreveu:

Finalizando:

linhas=$(awk -F";" '$5~/^[[:alpha:]]{1,}$/ {printf "%sd;" ,NR}' arquivo.txt)
sed -i "${linhas}" arquivo.txt

É isso . . .

Abç.:
Marcelo Oliver


Por que ainda tá insistindo no "for"?
O comando do Marcelo já resolve, e de forma bem mais elegante!


12. Re: Comando sed não está funcionando dentro do loop - Shell Script [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 08/03/2019 - 22:16h

Ryuk escreveu:
Por que ainda tá insistindo no "for"?
O comando do Marcelo já resolve, e de forma bem mais elegante!


eu creio que a resposta disso seja simples ... algumas soluções do Marcelo brilham à perfeição .. o problema é conseguir assimilar o comando ... eu já disse algo semelhante a isso antes ... eu prefiro fazer um script mais longo do que um compacto que não entendo ... o conhecimento do Marcelo nesse tal de shell é impressionante !!!

------------------------------------------------------| Linux User #621728 |------------------------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------------------| Linux User #621728 |------------------------------------------------------





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts