Imprime apenas uma linha por vez a partir do arquivo de texto

5

como posso imprimir ou exibir apenas palavras de um arquivo de texto de cada vez. Quando executo meu script, ele deve exibir apenas cada palavra do arquivo de texto, uma por uma, mas apenas exibir essa palavra.

Isso é o que eu fiz, mas exibe cada palavra em uma linha separada, mas mostra todas elas:

FS=$'\n'      
for j in 'cat read'
do
    echo "$j"
done

Eu quero que a saída seja algo como isto:

root@matrix:~> first word  ---> this word disappear when second is displayed
root@matrix:~> second word ---> this disappear when third is displayed
root@matrix:~> third word  ---> this disappear when fourth is displayed and continues like this to the end of the file!
    
por Hassen Fatima 21.03.2015 / 16:58

2 respostas

4

Você pode usar os comandos sleep e clear no seu script da seguinte forma:

for word in $(< read)
do
    echo "$word"
    sleep 1
    clear
done

Explicação:

O comando sleep faz atraso por um período de tempo especificado (em segundos). Com sleep 1 , o atraso seria de 1 segundo. Você pode mudar para mais tempo retardando o segundo parâmetro ou para atrasar menos de 1 segundo dividindo-o em unidades baixas; Como sleep .1 para atraso de 1/10 segundos ou sleep .001 para atraso de 1/1000 segundos e etc.

O comando clear limpa a tela do terminal.

Melhor ainda, você pode fazer isso abaixo do comando awk :

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' read

Explicação:

Em awk , o NF especifica o número total de campos no registro / linha de entrada atual, portanto, usando uma variável como um contador ( i ) e fazendo um loop sobre ele , estamos imprimindo todos eles da primeira posição até o final deles ( NF ). Então, usando a parte system("sleep 1; clear") , estamos dizendo a awk para chamar os comandos do sistema para dormir por 1 segundo e limpar a tela.

Acima, estamos exibindo o arquivo de entrada como palavra por palavra. Se você for exibir linha por linha, adicione IFS=$'\n' no script como:

IFS=$'\n'
for word in $(< read)
do
    echo "$word"
    sleep 1
    clear
done

E altere o comando awk como:

awk '{ $0; system("sleep 1; clear") }1' read
  • $0 especifica a linha atual. e o 1 on end ativa o comando print do padrão awk .
por devWeek 21.03.2015 / 18:16
4

Com bash , eu faria:

while IFS=$'\n' read -r line
do
    printf "%-${COLUMNS}s\r" "$line"
    sleep 1
done < file

Usando o retorno de carro ( \r ) em vez da alimentação de linha ( \n ), você pode sobrescrever a linha atual. O -${COLUMNS} preenche a saída com espaços para que as linhas anteriores sejam completamente sobrescritas.

Para uma solução por palavra, acho que é necessário um loop duplo:

while read -ra line
do 
    for word in "${line[@]}"
    do
        printf "%-${COLUMNS}s\r" "$word"
        sleep 1
    done
done < file
    
por muru 21.03.2015 / 19:05