Exibindo o conteúdo ao contrário

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

[ Hits: 14.530 ]

 


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

Desmontando um dispositivo ocupado

Variáveis de internacionalização no Slackware

TAR seletivo

Imprimindo "man pages"

Cronometrando o tempo de execução

Leitura recomendada

Atalhos do elementary OS

Como acertar o relógio do Linux via console

80 Comandos para o Linux (parte 1)

Cairo-dock sem composite

Fish Shell como padrão respeitando o /etc/profile

  

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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts