Exibindo o conteúdo ao contrário

Publicado por D. M. Tavares em 06/03/2008

[ Hits: 12.112 ]

 


Exibindo o conteúdo ao contrário



Estou construindo um script o qual necessita acessar um arquivo, linha a linha, partindo da última linha para a primeira linha. Existe algum comando que possa auxiliar a construção deste script?

Resposta: O comando cat exibe o conteúdo de um arquivo da primeira linha para a última linha, já o comando tac, cat escrito ao contrário, exibe o conteúdo de um arquivo da última linha para a primeira linha.

Exemplo de uso e saída do comando cat:

$ cat dias_semana.txt
Domingo
Segunda-feira
Terça-feira
Quarta-feira
Quinta-feira
Sexta-feira
Sábado

Exemplo de uso e saída do comando tac:

$ tac dias_semana.txt Sábado
Sexta-feira
Quinta-feira
Quarta-feira
Terça-feira
Segunda-feira
Domingo

Exemplo de um script que acessa um arquivo, linha a linha, partindo da última linha para a primeira linha:

#!/bin/bash

lista=`tac dias_semana.txt`
for item in $lista; do
    echo 'Hoje é '$item', dia de bebemorar :-)'
done

Saída do script acima:

Hoje é Sábado, dia de bebemorar :-)
Hoje é Sexta-feira, dia de bebemorar :-)
Hoje é Quinta-feira, dia de bebemorar :-)
Hoje é Quarta-feira, dia de bebemorar :-)
Hoje é Terça-feira, dia de bebemorar :-)
Hoje é Segunda-feira, dia de bebemorar :-)
Hoje é Domingo, dia de bebemorar :-)

Obs.: Caso necessite, troque tac por cat no script acima.

Abraços,

Prof. D.M.T.

Outras dicas deste autor

Mantendo o programa em execução após logout

Desmontando um dispositivo ocupado

Til (~) no modo console do Slackware

Mensagens do boot

Imprimindo "man pages"

Leitura recomendada

SSH - Apagando conflitos de chaves RSA no arquivo known_hosts

Dividindo arquivos em partes

Entenda como funciona o controle de restrições no Linux

Visualizando processos com o htop

Alterando o editor do crontab

  

Comentários
[1] Comentário enviado por elgio em 07/03/2008 - 09:17h

Teu script NÃO ACESSA l.inha por linha, mas sim PALAVRA por palavra.

Veja o efeito estranho se o arquivo tiver:

Linha um
Oura linha2 dois
Linha tres
Ultima grande linhona quatro

Isto ocorre porque o for não é o adequado aqui, pois ele pega palavra a palavra e nao linha a linha.

o while faz isto:

#!/bin/bash

tac arq.txt | while read item ; do
echo 'Hoje é '$item', dia de bebemorar :-)'
done


[2] Comentário enviado por prof.dmt em 07/03/2008 - 15:29h

Olá Elgio,

Obrigado por apontar meu descuido (erro). Na pressa, esqueci da variável 'IFS'.

Atribuindo o caracter 'nova linha' ('\n') à variável 'IFS ', é possível usar o 'for' para resolver o problema em questão. Assim, após a devida correção, o 'script' ficará:


#!/bin/bash

lista=`tac dias_semana.txt`
IFS='
'
for item in $lista; do
echo 'Hoje é '$item', dia de bebemorar :-)'
done


Nota: No 'script' acima, foi atribuindo o caracter 'nova linha' à variável 'IFS'.

Mais uma vez, obrigado Elgio. Com contribuições como a sua, a comunidade só tem a ganhar.


Abraços,

Prof. D.M.T.

[3] Comentário enviado por SMarcell em 08/03/2008 - 16:22h

Emulando o tac com o sed:

sed '1!G ; h ; $!d' < arquivo



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts