web-dev-qa-db-fra.com

N'imprimez qu'une ligne à la fois à partir d'un fichier texte

comment puis-je imprimer ou afficher uniquement Word à partir d'un fichier texte à la fois. Lorsque j'exécute mon script, chaque mot du fichier texte doit être affiché un par un, mais uniquement avec ce mot.

C’est ce que j’ai fait, mais il affiche chaque mot sur une ligne distincte, mais il les affiche tous:

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

Je veux que la sortie ressemble à quelque chose comme ça:

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!
5
Hassen Fatima

Vous pouvez utiliser les commandes sleep et clear de votre script comme suit:

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

Explication:

La commande sleep crée un délai d'un délai spécifié (en secondes). Avec sleep 1 le délai serait d'une seconde. Vous pouvez changer de délai en incrémentant le deuxième paramètre ou en différant moins d'une seconde, divisez-le en unités basses; Comme sleep .1 pour un délai de 1/10 seconde ou sleep .001 pour un délai de 1/1000 seconde, etc.

La commande clear efface l'écran du terminal.

Mieux encore, vous pouvez le faire via la commande awk ci-dessous:

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

Explication:

Dans awk, la NF spécifie le nombre total de champs dans l’enregistrement/la ligne en cours, en utilisant une variable comme compteur (i) et bouclant dessus, nous les imprimons tous de la 1ère position à la fin (NF). Ensuite, en utilisant la partie system("sleep 1; clear"), nous demandons à awk d'appeler les commandes système pour passer en mode veille pendant 1 seconde et d'effacer l'écran.


Ci-dessus, nous affichons le fichier d'entrée sous forme de Word à Word. Si vous voulez l'afficher ligne par ligne, ajoutez IFS=$'\n' dans le script, comme suit:

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

Et changez la commande awk comme suit:

awk '{ $0; system("sleep 1; clear") }1' read
  • $0 spécifie la ligne en cours. et le 1 on active la commande par défaut awk print .
4
αғsнιη

Avec bash, je ferais:

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

En utilisant le retour chariot (\r) à la place du saut de ligne (\n), vous pouvez remplacer la ligne en cours. Le -${COLUMNS} complète la sortie avec des espaces afin que les lignes précédentes soient complètement écrasées.

Pour une solution par mot, je pense qu'une double boucle est nécessaire:

while read -ra line
do 
    for Word in "${line[@]}"
    do
        printf "%-${COLUMNS}s\r" "$Word"
        sleep 1
    done
done < file
4
muru