6

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!
1
  • 1
    I am sure you could write an awk script to do this
    – Panther
    Mar 21, 2015 at 16:39

2 Answers 2

5

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.
2
  • Thank you this solved my problem. Can you also tell me how do I display 120 or more words in one minutes! Mar 21, 2015 at 23:20
  • @HassenFatima decrease the second to low unit by sleep .1 (it means each word/line per 1/10 second) or sleep .001 (means each word/line in 1/1000 second) and lower by .00000000000...1 Mar 22, 2015 at 7:26
4

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
4
  • I thought OP's input file has more than one word in each line :/ Mar 21, 2015 at 18:16
  • @KasiyA Hmmm. I assumed that OP meant IFS and not FS in the first line, in which case, it goes line by line.
    – muru
    Mar 21, 2015 at 18:23
  • But your script will fails if the first word in fist line was long-length and second word in next line was small-length than previous shown line. run your script on this input as example Mar 21, 2015 at 18:27
  • 1
    @KasiyA fixed that.
    – muru
    Mar 21, 2015 at 18:29

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .