Remover o ultimo caracter da ultima linha de uma determinada consulta.

13. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

rhuan-pk
rhuan-pk

(usa Ubuntu)

Enviado em 28/07/2022 - 16:13h

hugoccgomes escreveu:

Boa tarde Pessoal.
Sou novo no shell e estou com dificuldade para eliminar o ultimo caracter da ultima linha em uma determinada consulta, como demonstrado abaixo:
1234567890,
0987654321,
3215465488,

Quero eliminar apenas a ultima virgula da ultima linha, sendo que independente do resulrados e quantidade de linhas que a consulta traga, preciso eliminar apenas o ultimo caracter.

1234567890,
0987654321,
3215465488

Grato pela atenção.


Eu pensei em algo um pouquinho diferente, faz a alteração somente na linha desejada, que no caso é a última... o comando wc com a opção -l vai trazer o número total de linha, logo o valor total de linhas é por acaso a última linha também...:


sed "$(wc -l file.txt | cut -d ' ' -f 1)s/,$//" file.txt


OBS: O comando wc -l, além do número total de linhas, traz o nome do arquivo, por isso que usamos o comando cut pra pegar só a primeira coluna (sendo o delimitador um único backspace)

Edit 1: Comando depois da sujestão do @msoliver


sed "$(wc -l < file.txt)s/,$//" file.txt


Edit 2: Não esqueça de usar a opção -i no sed caso queira persistir a informação.

Segue print de exemplo:



  


14. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/07/2022 - 16:28h


rhuan-pk escreveu:


hugoccgomes escreveu:

Boa tarde Pessoal.
Sou novo no shell e estou com dificuldade para eliminar o ultimo caracter da ultima linha em uma determinada consulta, como demonstrado abaixo:
1234567890,
0987654321,
3215465488,

Quero eliminar apenas a ultima virgula da ultima linha, sendo que independente do resulrados e quantidade de linhas que a consulta traga, preciso eliminar apenas o ultimo caracter.

1234567890,
0987654321,
3215465488

Grato pela atenção.


Eu pensei em algo um pouquinho diferente, faz a alteração somente na linha desejada, que no caso é a última... o comando wc com a opção -l vai trazer o número total de linha, logo o valor total de linhas é por acaso a última linha também...:


sed "$(wc -l file.txt | cut -d ' ' -f 1)s/,$//" file.txt


OBS: O comando wc -l, além do número total de linhas, traz o nome do arquivo, por isso que usamos o comando cut pra pegar só a primeira coluna (sendo o delimitador um único backspace)

Segue print de exemplo:

Boa tarde rhuan-pk.
Se usar o direcionador, mostra somente o número de linhas:
Ex:
wc -l < file.txt
500

#Fica_a_dica

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



15. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

rhuan-pk
rhuan-pk

(usa Ubuntu)

Enviado em 28/07/2022 - 19:08h

msoliver escreveu:


rhuan-pk escreveu:


hugoccgomes escreveu:

Boa tarde Pessoal.
Sou novo no shell e estou com dificuldade para eliminar o ultimo caracter da ultima linha em uma determinada consulta, como demonstrado abaixo:
1234567890,
0987654321,
3215465488,

Quero eliminar apenas a ultima virgula da ultima linha, sendo que independente do resulrados e quantidade de linhas que a consulta traga, preciso eliminar apenas o ultimo caracter.

1234567890,
0987654321,
3215465488

Grato pela atenção.


Eu pensei em algo um pouquinho diferente, faz a alteração somente na linha desejada, que no caso é a última... o comando wc com a opção -l vai trazer o número total de linha, logo o valor total de linhas é por acaso a última linha também...:


sed "$(wc -l file.txt | cut -d ' ' -f 1)s/,$//" file.txt


OBS: O comando wc -l, além do número total de linhas, traz o nome do arquivo, por isso que usamos o comando cut pra pegar só a primeira coluna (sendo o delimitador um único backspace)

Segue print de exemplo:

Boa tarde rhuan-pk.
Se usar o direcionador, mostra somente o número de linhas:
Ex:
wc -l < file.txt
500

#Fica_a_dica

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


Boa garoto! Dessa eu não sabia, já adicionei aqui na pool.

Aliás, você sabe explicar o porquê desse comportamento? (não é uma pergunta retórica)

Eu estava pensando aqui que... como ele está lendo direto da STDIN, ele acaba lendo somente o conteúdo do arquivo e não o arquivo "por inteiro". Se for o caso, como ele não tem o nome do arquivo e só o conteúdo, ele mostra somente as linhas... Será que isso faz sentido?


16. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/07/2022 - 19:26h


hugoccgomes escreveu:

Vou passar o script completo para um melhor entendimento do que desejo fazer.

#!/user/bin/env bash

file="linhas.txt"
lines=$(cat $file)
for line in $lines
do
# echo $line | awk '{printf("\"%s\"\n", $0);}'
echo $line | awk '{printf("\x27%s\x27,\n", $0);}'


done
~


Uma dúvida: tu precisa exibir na tela linha por linha do arquivo? Ou alterar o arquivo removendo o último caractere da última linha, já resolve?

Se for só alterar, o comando 'sed' resolveria o problema, não precisaria percorrer o arquivo todo linha por linha. Provavelmente, o motivo de não ter funcionado na sua máquina, foi por conta do problema apontado pelo msoliver.
O 'fim da linha' de um arquivo é relevante para qualquer tipo de leitura feita por script. Esse problema ocorre quando um arquivo é gerado no Windows, e "lido" por scripts feitos em Linux.
Nesses casos, é importante fazer uma conversão antes de iniciar a leitura.

Se precisar "printar" linha por linha, e seguindo a mesma ideia do seu script, uma outra opção seria:
#!/usr/bin/env bash

file="linhas.txt"
sed -i '$s/,$//' $file

while read line; do
printf "\x27%s\x27,\n" $line
done < $file

Nesse caso, não precisa usar AWK apenas para usar printf, o próprio bash possui o printf como um recurso builtin.

Se não precisar exibir linhas, só executar no próprio terminal, sem script:
$ sed -i '$s/,$//' linhas.txt 



17. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/07/2022 - 19:38h

stormer escreveu:

Não tem problema nenhum o fato desses dados estarem em um arquivo.. Como ele não mencionou o tamanho do arquivo, não vi necessidade de usar sed.

Pode-se carregar o arquivo em uma variável antes:

var=$(<arquivo.txt)

echo "${var%?}" >arquivo.txt



Sim, em programação imperativa sempre haverá N formas de resolver o mesmo problema. No caso, para defender o uso do sed ao invés de uma variável, foi pelo fato de apenas precisar alterar o último caractere da última linha de um arquivo.
Como não ficou claro a intenção no início, achei mais viável usar o sed, que é basicamente um editor de textos não interativo.

A criação de uma variável é útil quando precisamos reutilizar o seu valor em algum momento do código. Nesse caso, como só precisaria alterar um único caractere de um arquivo, não vejo a utilidade em criar uma variável apenas para fazer um replace de string para depois fazer um redirect para um arquivo.
Agora, lógico, quando a situação é imprimir linha por linha do arquivo e também alterar o conteúdo, ai faria mais sentido ao meu ver.


18. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/07/2022 - 21:28h

Quando não for usar o parâmetro mais e quiser liberar a locação de memória:

unset var  #???? 





19. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

rhuan-pk
rhuan-pk

(usa Ubuntu)

Enviado em 28/07/2022 - 21:41h


stormer escreveu:

Quando não for usar o parâmetro mais e quiser liberar a locação de memória:

unset var  #???? 




Até aonde eu sei, é isso mesmo... da uma olhada na man page do comando para ver o que diz.


20. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/07/2022 - 22:02h


rhuan-pk escreveu:

msoliver escreveu:


rhuan-pk escreveu:


hugoccgomes escreveu:

Boa tarde Pessoal.
Sou novo no shell e estou com dificuldade para eliminar o ultimo caracter da ultima linha em uma determinada consulta, como demonstrado abaixo:
1234567890,
0987654321,
3215465488,

Quero eliminar apenas a ultima virgula da ultima linha, sendo que independente do resulrados e quantidade de linhas que a consulta traga, preciso eliminar apenas o ultimo caracter.

1234567890,
0987654321,
3215465488

Grato pela atenção.


Eu pensei em algo um pouquinho diferente, faz a alteração somente na linha desejada, que no caso é a última... o comando wc com a opção -l vai trazer o número total de linha, logo o valor total de linhas é por acaso a última linha também...:


sed "$(wc -l file.txt | cut -d ' ' -f 1)s/,$//" file.txt


OBS: O comando wc -l, além do número total de linhas, traz o nome do arquivo, por isso que usamos o comando cut pra pegar só a primeira coluna (sendo o delimitador um único backspace)

Segue print de exemplo:

Boa tarde rhuan-pk.
Se usar o direcionador, mostra somente o número de linhas:
Ex:
wc -l < file.txt
500

#Fica_a_dica

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


Boa garoto! Dessa eu não sabia, já adicionei aqui na pool.

Aliás, você sabe explicar o porquê desse comportamento? (não é uma pergunta retórica)

Eu estava pensando aqui que... como ele está lendo direto da STDIN, ele acaba lendo somente o conteúdo do arquivo e não o arquivo "por inteiro". Se for o caso, como ele não tem o nome do arquivo e só o conteúdo, ele mostra somente as linhas... Será que isso faz sentido?


Justamente,
wc -l < arquivo.txt
o "wc" pega somente o conteúdo do arquivo.
É o mesmo que cat arquivo|wc -l


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



21. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Hugo César Cordeiro Gomes
hugoccgomes

(usa Ubuntu)

Enviado em 29/07/2022 - 07:31h


ru4n escreveu:


hugoccgomes escreveu:

Vou passar o script completo para um melhor entendimento do que desejo fazer.

#!/user/bin/env bash

file="linhas.txt"
lines=$(cat $file)
for line in $lines
do
# echo $line | awk '{printf("\"%s\"\n", $0);}'
echo $line | awk '{printf("\x27%s\x27,\n", $0);}'


done
~


Uma dúvida: tu precisa exibir na tela linha por linha do arquivo? Ou alterar o arquivo removendo o último caractere da última linha, já resolve?

Se for só alterar, o comando 'sed' resolveria o problema, não precisaria percorrer o arquivo todo linha por linha. Provavelmente, o motivo de não ter funcionado na sua máquina, foi por conta do problema apontado pelo msoliver.
O 'fim da linha' de um arquivo é relevante para qualquer tipo de leitura feita por script. Esse problema ocorre quando um arquivo é gerado no Windows, e "lido" por scripts feitos em Linux.
Nesses casos, é importante fazer uma conversão antes de iniciar a leitura.

Se precisar "printar" linha por linha, e seguindo a mesma ideia do seu script, uma outra opção seria:
#!/usr/bin/env bash

file="linhas.txt"
sed -i '$s/,$//' $file

while read line; do
printf "\x27%s\x27,\n" $line
done < $file

Nesse caso, não precisa usar AWK apenas para usar printf, o próprio bash possui o printf como um recurso builtin.

Se não precisar exibir linhas, só executar no próprio terminal, sem script:
$ sed -i '$s/,$//' linhas.txt 

========================
Bom dia!

Minha necessidade é a seguinte, preciso que meu script leia um arquivo que será prenchico com varios numeros de linhas e neste caso não é um numero exato, no entanto todas as linhas que serão inseridas precisam receber Tanto as ' " ' no inicio e fim de cada linha, quanto a ' , ' como no exemplo abaixo, porem para que eu possa realizar uma determinada consulta no BD, preciso que a ultima linha não apresente a ultima ' , ', saindo desta forma:

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',

para esta.

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463' <--------- sem a virgula.
e tanto faz ser duas linhas, como 1000, apenas a ultima não pode conter a virgula.

O comando indicado por rhuan-pk ( sed "$(wc -l < file.txt)s/,$//" file.txt ) na imagem abaixo, funciona se eu executar diretamente no bash, mas se eu inserir no scropt não dá certo.







22. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/07/2022 - 09:57h

hugoccgomes escreveu:
Bom dia!

Minha necessidade é a seguinte, preciso que meu script leia um arquivo que será prenchico com varios numeros de linhas e neste caso não é um numero exato, no entanto todas as linhas que serão inseridas precisam receber Tanto as ' " ' no inicio e fim de cada linha, quanto a ' , ' como no exemplo abaixo, porem para que eu possa realizar uma determinada consulta no BD, preciso que a ultima linha não apresente a ultima ' , ', saindo desta forma:

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',

para esta.

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463' <--------- sem a virgula.
e tanto faz ser duas linhas, como 1000, apenas a ultima não pode conter a virgula.

O comando indicado por rhuan-pk ( sed "$(wc -l < file.txt)s/,$//" file.txt ) na imagem abaixo, funciona se eu executar diretamente no bash, mas se eu inserir no scropt não dá certo.


Bom, se nenhum script com sed está funcionando em seu ambiente, sugiro testar uma opção com python. De quebra, criei uma função que já faz a conversão de 'fim de linha' para unix, e também fiz duas versões: uma que só "printa" na tela, e uma outra que cria uma query sql para consulta. Ai tu adapta conforme a necessidade:

script para exibir os valores:
#!/usr/bin/env python3

def dos2unix(f):
content = ''
with open(f, "rb") as dos_file:
content = dos_file.read()

content = content.replace(b'\r\n', b'\n')

with open(f, "wb") as unix_file:
unix_file.write(content)

input_file = "linhas.txt" # NOME DO ARQUIVO
dos2unix(input_file)

values = []
file = open(input_file, "r")

for line in file:
formatted_string = line.replace('\n', '')[:-1]
values.append(formatted_string)

# Exibe os valores na tela
formatted_values = ",\n".join(values)
print(formatted_values)

# Exibe a Query de consulta
#formatted_values = ",".join(values)
#print(f"SELECT * FROM `table` WHERE `field` IN ({formatted_values})")


Testes usando o arquivo 'linhas.txt':
$ cat linhas.txt
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',


Rodando o 'script.py':
$ ./script.py
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463'


Rodando o 'script.py' com query:
$ ./script.py
SELECT * FROM `table` WHERE `field` IN ('5571996167892','5583982093160','5511910382315','5511999353921','5571996264463')


Agora, se nenhuma dessas opções funcionar, incluíndo o script python, e os scripts bash sugerido pelos colegas, provavelmente há algo errado com o seu ambiente. Nesse caso, o ideal seria dizer qual distribuição está rodando, e versão do bash também.


23. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Hugo César Cordeiro Gomes
hugoccgomes

(usa Ubuntu)

Enviado em 29/07/2022 - 10:10h


ru4n escreveu:

hugoccgomes escreveu:
Bom dia!

Minha necessidade é a seguinte, preciso que meu script leia um arquivo que será prenchico com varios numeros de linhas e neste caso não é um numero exato, no entanto todas as linhas que serão inseridas precisam receber Tanto as ' " ' no inicio e fim de cada linha, quanto a ' , ' como no exemplo abaixo, porem para que eu possa realizar uma determinada consulta no BD, preciso que a ultima linha não apresente a ultima ' , ', saindo desta forma:

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',

para esta.

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463' <--------- sem a virgula.
e tanto faz ser duas linhas, como 1000, apenas a ultima não pode conter a virgula.

O comando indicado por rhuan-pk ( sed "$(wc -l < file.txt)s/,$//" file.txt ) na imagem abaixo, funciona se eu executar diretamente no bash, mas se eu inserir no scropt não dá certo.


Bom, se nenhum script com sed está funcionando em seu ambiente, sugiro testar uma opção com python. De quebra, criei uma função que já faz a conversão de 'fim de linha' para unix, e também fiz duas versões: uma que só "printa" na tela, e uma outra que cria uma query sql para consulta. Ai tu adapta conforme a necessidade:

script para exibir os valores:
#!/usr/bin/env python3

def dos2unix(f):
content = ''
with open(f, "rb") as dos_file:
content = dos_file.read()

content = content.replace(b'\r\n', b'\n')

with open(f, "wb") as unix_file:
unix_file.write(content)

input_file = "linhas.txt" # NOME DO ARQUIVO
dos2unix(input_file)

values = []
file = open(input_file, "r")

for line in file:
formatted_string = line.replace('\n', '')[:-1]
values.append(formatted_string)

# Exibe os valores na tela
formatted_values = ",\n".join(values)
print(formatted_values)

# Exibe a Query de consulta
#formatted_values = ",".join(values)
#print(f"SELECT * FROM `table` WHERE `field` IN ({formatted_values})")


Testes usando o arquivo 'linhas.txt':
$ cat linhas.txt
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',


Rodando o 'script.py':
$ ./script.py
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463'


Rodando o 'script.py' com query:
$ ./script.py
SELECT * FROM `table` WHERE `field` IN ('5571996167892','5583982093160','5511910382315','5511999353921','5571996264463')


Agora, se nenhuma dessas opções funcionar, incluíndo o script python, e os scripts bash sugerido pelos colegas, provavelmente há algo errado com o seu ambiente. Nesse caso, o ideal seria dizer qual distribuição está rodando, e versão do bash também.


===========================

Vou testar e depois passo o feedback. Vlw.




24. Re: Remover o ultimo caracter da ultima linha de uma determinada consulta.

Hugo César Cordeiro Gomes
hugoccgomes

(usa Ubuntu)

Enviado em 01/08/2022 - 07:21h


hugoccgomes escreveu:


ru4n escreveu:

hugoccgomes escreveu:
Bom dia!

Minha necessidade é a seguinte, preciso que meu script leia um arquivo que será prenchico com varios numeros de linhas e neste caso não é um numero exato, no entanto todas as linhas que serão inseridas precisam receber Tanto as ' " ' no inicio e fim de cada linha, quanto a ' , ' como no exemplo abaixo, porem para que eu possa realizar uma determinada consulta no BD, preciso que a ultima linha não apresente a ultima ' , ', saindo desta forma:

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',

para esta.

'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463' <--------- sem a virgula.
e tanto faz ser duas linhas, como 1000, apenas a ultima não pode conter a virgula.

O comando indicado por rhuan-pk ( sed "$(wc -l < file.txt)s/,$//" file.txt ) na imagem abaixo, funciona se eu executar diretamente no bash, mas se eu inserir no scropt não dá certo.


Bom, se nenhum script com sed está funcionando em seu ambiente, sugiro testar uma opção com python. De quebra, criei uma função que já faz a conversão de 'fim de linha' para unix, e também fiz duas versões: uma que só "printa" na tela, e uma outra que cria uma query sql para consulta. Ai tu adapta conforme a necessidade:

script para exibir os valores:
#!/usr/bin/env python3

def dos2unix(f):
content = ''
with open(f, "rb") as dos_file:
content = dos_file.read()

content = content.replace(b'\r\n', b'\n')

with open(f, "wb") as unix_file:
unix_file.write(content)

input_file = "linhas.txt" # NOME DO ARQUIVO
dos2unix(input_file)

values = []
file = open(input_file, "r")

for line in file:
formatted_string = line.replace('\n', '')[:-1]
values.append(formatted_string)

# Exibe os valores na tela
formatted_values = ",\n".join(values)
print(formatted_values)

# Exibe a Query de consulta
#formatted_values = ",".join(values)
#print(f"SELECT * FROM `table` WHERE `field` IN ({formatted_values})")


Testes usando o arquivo 'linhas.txt':
$ cat linhas.txt
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463',


Rodando o 'script.py':
$ ./script.py
'5571996167892',
'5583982093160',
'5511910382315',
'5511999353921',
'5571996264463'


Rodando o 'script.py' com query:
$ ./script.py
SELECT * FROM `table` WHERE `field` IN ('5571996167892','5583982093160','5511910382315','5511999353921','5571996264463')


Agora, se nenhuma dessas opções funcionar, incluíndo o script python, e os scripts bash sugerido pelos colegas, provavelmente há algo errado com o seu ambiente. Nesse caso, o ideal seria dizer qual distribuição está rodando, e versão do bash também.


===========================

Vou testar e depois passo o feedback. Vlw.



Ru4n>>Bom dia!

Cara fiz uma adaptação do script que voce criou em Python com meu Shell e deu certo. Agora é fazer um ajuste fino para simplificar o processo.
Muito obrigado e este tópico está resolvido.

Aliás agradeço a todos que de alguma forma me ajudaram a pensar neste script.

Forte abraço.





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts