Alterar Lista TXT [RESOLVIDO]

1. Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 11/11/2021 - 11:10h

Bom dia caros colegas, estou tentando fazer um script para alterar um arquivo TXT automatico. No caso ele preenche uma linha com varios numeros, e esses devem repitir na linha debaixo até encontrar outro preenchido, vou dar o exemplo abaixo:
Esta e minha lista original: Lista1.txt

Evol-1-202110-817577-30525803-20211006-0003
Evol-2-
Evol-3-
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-
Evol-6-
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-

O que eu gostaria de fazer e que na linha 2 do arquivo como esta faltando os numero ele prenchesse com a mesma sequencia do anterior, então ele preencheria as linhas 2 e 3 complentando o texto, na linha 4 ele nao faria nada e na 5 repetiria da 4 e assim por diante, gerando o seguinte resultado no final:

Evol-1-202110-817577-30525803-20211006-0003
Evol-2-202110-817577-30525803-20211006-0003
Evol-3-202110-817577-30525803-20211006-0003
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-202110-817577-30525803-20211007-0003
Evol-6-202110-817577-30525803-20211007-0003
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-202110-817577-30525803-20211008-0003
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-202110-817577-30525803-20211009-0003
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-202110-817577-30525803-20211010-0003
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-202110-817577-30525803-20211011-0003
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-202110-817577-30525803-20211012-0003

Pensei em fazer algo que contasse os caracteres antes de inserir o outro, mais não evolui... tentei ler cada linha com head e o grep porém o numero da linha nao da certo por conta de ter muitos numeros...

Qualquer dica ou ajuda é bem vinda!

Desde ja agradeço!




  


2. MELHOR RESPOSTA

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 12/11/2021 - 18:31h

v aí se ajuda
#!/bin/bash
while read line ; do
var=`echo $line | cut -d'-' -f 1-2`; var1=`echo $line | cut -d'-' -f 3`
[ -z "$var1" ] && sed -i "/$var/ s/$/$var2/" txt.txt || var2=`echo $line | cut -d'-' -f 3-7`
done < txt.txt


mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-
Evol-3-
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-
Evol-6-
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-
mauricio@phantom ~/testes $ ./sh.sh
mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-02110-817577-30525803-20211006-003
Evol-3-02110-817577-30525803-20211006-003
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-202110-817577-30525803-20211007-0003
Evol-6-202110-817577-30525803-20211007-0003
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-202110-817577-30525803-20211008-0003
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-202110-817577-30525803-20211009-0003
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-202110-817577-30525803-20211010-0003
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-202110-817577-30525803-20211011-0003
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-202110-817577-30525803-20211012-0003
mauricio@phantom ~/testes $



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

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

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



3. Re: Alterar Lista TXT

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 11/11/2021 - 14:58h

kra ... vou dar ideia mais ou menos que aqui não rola de eu fazer para testar, faz um loop

levando em consideração que a 1ª linha é cheia
pega um cut -d'-' -f 3 da primeira linha e armazena em var1 ... vai para a 2ª linha e faz o mesmo cut, se em branco cola no final da linha $var, senão repete o 1º processo e vai para a próxima linha .


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

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

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




4. Re: Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 12/11/2021 - 10:32h

Não sei o que esta errado!
Mais estou no caminnho já..



#!/bin/bash

nlin=`cat Lista1.txt | wc -l`
N=1;
N2=$((N+1))
while (($N<=${nlin}));do
nome01=`sed -n $N"p" Lista1.txt` # | wc -c #Pega o campo01 de cada linha, (com base na var $N) do arquivo "lista01.txt"
nome02=`sed -n $N2"p" Lista1.txt` # | wc -c #Pega o campo01 de cada linha, (com base na var $N) do arquivo "lista02.txt"

#echo $nome01
#echo $nome02

if [ "$nome02" -le "20" ];
then
echo "Adicionar na linha a Linha 01 no lugar"
else
fi

let N++;
let N2++;
done




5. Re: Alterar Lista TXT

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 12/11/2021 - 16:50h

brainnersilva, boa tarde.
Testei aqui e funcionou, segue:
#!/usr/bin/env bash

[ $1 -a -s $1 ] && arq=$1 || { printf "\x1bc\e[2;38mInforme um arquivo como parâmetro\e[m\n";exit;}
nr=$(awk 'END{print NR}' $arq);
x=1;
while (($x<=$nr));do
line=$(sed -n "${x}p" $arq);
echo $line;
for ((y=$((x+1));y<=$nr;y++));do
nextline=$(sed -n "${y}p" $arq);
#A comparação é feita pelo nº de campos.
if (( $(awk -F"-" '{print NF}' <<< "${line}") != $(awk -F"-" '{print NF}' <<< "${nextline}") ));then
printf "\e[2;38m»»\e[m Linha:$x != Linha:$y \e[2;38m««\e[m\n" ##Usada para testes##
printf "${nextline}$(sed 's/^[A-Z][a-z]\+-[0-9]\+-//' <<< "${line}")\n"
else
break;
fi
done
x=$y;
done

Obs.: Informe o arquivo como Parâmetro.
Exemplo:
./script arquivo.txt

----------------------------------------------------------------------------------------------------------------
Com awk:
A diferença do tempo de execução é muito grande.....
cat awk.out

BEGIN {
FS = "-"
}

NF >= 7 {
printf "%s\n", var = $0
}

NF < 7 {
sub(/(^Evol-)[0-9]+[-]/, "", var)
print $0 "" var


awk -f awk.out arquivo.txt


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/|sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



6. Re: Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 12/11/2021 - 19:09h

Obrigado pela aula e pela reposta... vou fazer os teste e entender extamente...

Valeu demais!



msoliver escreveu:

brainnersilva, boa tarde.
Testei aqui e funcionou, segue:
#!/usr/bin/env bash

[ $1 -a -s $1 ] && arq=$1 || { printf "\x1bc\e[2;38mInforme um arquivo como parâmetro\e[m\n";exit;}
nr=$(awk 'END{print NR}' $arq);
x=1;
while (($x<=$nr));do
line=$(sed -n "${x}p" $arq);
echo $line;
for ((y=$((x+1));y<=$nr;y++));do
nextline=$(sed -n "${y}p" $arq);
#A comparação é feita pelo nº de campos.
if (( $(awk -F"-" '{print NF}' <<< "${line}") != $(awk -F"-" '{print NF}' <<< "${nextline}") ));then
printf "\e[2;38m»»\e[m Linha:$x != Linha:$y \e[2;38m««\e[m\n" ##Usada para testes##
printf "${nextline}$(sed 's/^[A-Z][a-z]\+-[0-9]\+-//' <<< "${line}")\n"
else
break;
fi
done
x=$y;
done

Obs.: Informe o arquivo como Parâmetro.
Exemplo:
./script arquivo.txt

----------------------------------------------------------------------------------------------------------------
Com awk:
A diferença do tempo de execução é muito grande.....
cat awk.out

BEGIN {
FS = "-"
}

NF >= 7 {
printf "%s\n", var = $0
}

NF < 7 {
sub(/(^Evol-)[0-9]+[-]/, "", var)
print $0 "" var
}
awk -f awk.out arquivo.txt


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/|sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________





7. Re: Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 12/11/2021 - 19:10h


Simples e eficiente.. valeu demais mesmo pela ajuda... obrigado!

Vou testar agorinha.


Mauriciodez escreveu:

v aí se ajuda
#!/bin/bash
while read line ; do
var=`echo $line | cut -d'-' -f 1-2`; var1=`echo $line | cut -d'-' -f 3`
[ -z "$var1" ] && sed -i "/$var/ s/$/$var2/" txt.txt || var2=`echo $line | cut -d'-' -f 3-7`
done < txt.txt


mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-
Evol-3-
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-
Evol-6-
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-
mauricio@phantom ~/testes $ ./sh.sh
mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-02110-817577-30525803-20211006-003
Evol-3-02110-817577-30525803-20211006-003
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-202110-817577-30525803-20211007-0003
Evol-6-202110-817577-30525803-20211007-0003
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-202110-817577-30525803-20211008-0003
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-202110-817577-30525803-20211009-0003
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-202110-817577-30525803-20211010-0003
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-202110-817577-30525803-20211011-0003
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-202110-817577-30525803-20211012-0003
mauricio@phantom ~/testes $



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

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

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






8. Re: Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 16/11/2021 - 09:07h

Funcionou 100%...

VAleu pega ajuda.. vou preferir usar este.. consegui entender kkkk




brainnersilva escreveu:


Simples e eficiente.. valeu demais mesmo pela ajuda... obrigado!

Vou testar agorinha.


Mauriciodez escreveu:

v aí se ajuda
#!/bin/bash
while read line ; do
var=`echo $line | cut -d'-' -f 1-2`; var1=`echo $line | cut -d'-' -f 3`
[ -z "$var1" ] && sed -i "/$var/ s/$/$var2/" txt.txt || var2=`echo $line | cut -d'-' -f 3-7`
done < txt.txt


mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-
Evol-3-
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-
Evol-6-
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-
mauricio@phantom ~/testes $ ./sh.sh
mauricio@phantom ~/testes $ cat txt.txt
Evol-1-02110-817577-30525803-20211006-003
Evol-2-02110-817577-30525803-20211006-003
Evol-3-02110-817577-30525803-20211006-003
Evol-4-202110-817577-30525803-20211007-0003
Evol-5-202110-817577-30525803-20211007-0003
Evol-6-202110-817577-30525803-20211007-0003
Evol-7-202110-817577-30525803-20211008-0003
Evol-8-202110-817577-30525803-20211008-0003
Evol-9-202110-817577-30525803-20211009-0003
Evol-10-202110-817577-30525803-20211009-0003
Evol-11-202110-817577-30525803-20211010-0003
Evol-12-202110-817577-30525803-20211010-0003
Evol-13-202110-817577-30525803-20211011-0003
Evol-14-202110-817577-30525803-20211011-0003
Evol-15-202110-817577-30525803-20211012-0003
Evol-16-202110-817577-30525803-20211012-0003
mauricio@phantom ~/testes $



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

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

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








9. Re: Alterar Lista TXT [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 16/11/2021 - 09:08h

Obrigado pela ajuda ! funcionou perfeitamente.. ainda estou tentando entender muitas coisas que eu não sei no script, porém o nível e bem mais alto nele, pra eu fazer alguma alteraçao vou penar demais...

Mas Agradeço a ajuda! Me ajudaram e ensinaram bastante... valeu!


msoliver escreveu:

brainnersilva, boa tarde.
Testei aqui e funcionou, segue:
#!/usr/bin/env bash

[ $1 -a -s $1 ] && arq=$1 || { printf "\x1bc\e[2;38mInforme um arquivo como parâmetro\e[m\n";exit;}
nr=$(awk 'END{print NR}' $arq);
x=1;
while (($x<=$nr));do
line=$(sed -n "${x}p" $arq);
echo $line;
for ((y=$((x+1));y<=$nr;y++));do
nextline=$(sed -n "${y}p" $arq);
#A comparação é feita pelo nº de campos.
if (( $(awk -F"-" '{print NF}' <<< "${line}") != $(awk -F"-" '{print NF}' <<< "${nextline}") ));then
printf "\e[2;38m»»\e[m Linha:$x != Linha:$y \e[2;38m««\e[m\n" ##Usada para testes##
printf "${nextline}$(sed 's/^[A-Z][a-z]\+-[0-9]\+-//' <<< "${line}")\n"
else
break;
fi
done
x=$y;
done

Obs.: Informe o arquivo como Parâmetro.
Exemplo:
./script arquivo.txt

----------------------------------------------------------------------------------------------------------------
Com awk:
A diferença do tempo de execução é muito grande.....
cat awk.out

BEGIN {
FS = "-"
}

NF >= 7 {
printf "%s\n", var = $0
}

NF < 7 {
sub(/(^Evol-)[0-9]+[-]/, "", var)
print $0 "" var


awk -f awk.out arquivo.txt


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/|sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________





10. Re: Alterar Lista TXT [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 16/11/2021 - 12:50h


brainnersilva escreveu:
Funcionou 100%...
VAleu pega ajuda.. vou preferir usar este.. consegui entender kkkk


Bom que resolveu ... Marque seu tópico como "Resolvido" e depois assinale a "Melhor Resposta".

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

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

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








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts