Print only one line at a time from text file

how can I print or display only word from a text file at a time. When I run my script it should only display each word from the text file one by one, but only display that word.

This is what I have done, but it displays each word on separate line, but it shows all of them:

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

I want the output to look something like this:

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!

You can use sleep and clear commands in your script as following:

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

Explanation:

The sleep command make delay for a specified amount of time (in seconds). With sleep 1 delay would be for 1 second. You can change for more time delay by incrementing the second parameter or for delaying less than 1 second divide it to low units; Like sleep .1 for 1/10 second delay or sleep .001 for 1/1000 second delay and etc.

The clear command clear the terminal screen.

Even better you can do this through below awk command:

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

Explanation:

In awk, the NF specifies the total number of fields in the current input record/line, so by using a variable as a counter (i) and looping over it, we are printing all of them from 1st position to the end of them (NF). Then by using the system("sleep 1; clear") part, we are telling to awk to calling the system commands to sleeping for 1 second and clearing the screen.


In above we are displaying the input file as word by word. If you are going to display it line by line add IFS=$'\n' in the script like:

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

And change the awk command like:

awk '{ $0; system("sleep 1; clear") }1' read
  • $0 specifies the current line. and the 1 on end enables the default awk's print command.

With bash, I'd do:

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

By using the carriage return (\r) instead of line feed (\n), you can overwrite the current line. The -${COLUMNS} pads the output with spaces so that previous lines are completely overwritten.

For a per-word solution, I think a double loop is needed:

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