Pular para o conteúdo

Exibindo o conteúdo ao contrário

Dica publicada em Linux / Comandos
D. M. Tavares prof.dmt
Hits: 15.205 Categoria: Linux Subcategoria: Comandos
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Variáveis de internacionalização no Slackware

Desmontando um dispositivo ocupado

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

Imprimindo "man pages"

Til (~) no modo console do Slackware

Convertendo em massa "end-of-line" de arquivos de texto entre Windows, GNU/Linux e Mac OS

Listando os últimos comandos executados no bash

Ordenando as coisas com sort

Selecionando arquivos com o tar (backup)

RAC - Rows and Columns

#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

Entre na sua conta para comentar.