Печатать только одну строку за раз из текстового файла

Как я могу печатать или отображать только слова из текстового файла одновременно. Когда я запускаю свой скрипт, он должен отображать только каждое слово из текстового файла одно за другим, а отображать только это слово.

Это то, что я сделал, но оно отображает каждое слово в отдельной строке, но показывает все из них:

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

Я хочу, чтобы вывод выглядел примерно так:

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!

2 ответа

Решение

Ты можешь использовать sleep а также clear Команды в вашем скрипте следующие:

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

Объяснение:

sleep Команда make delay на указанное количество времени (в секундах). С sleep 1 задержка будет на 1 секунду. Вы можете изменить более длительную задержку, увеличив второй параметр или задержав менее 1 секунды, разделив его на младшие единицы; подобно sleep .1 с задержкой 1/10 секунды или sleep .001 для задержки 1/1000 секунды и т. д.

clear Команда очистить экран терминала.

Еще лучше вы можете сделать это через ниже awk команда:

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

Объяснение:

В awk, NF указывает общее количество полей в текущей входной записи / строке, поэтому с помощью переменной в качестве счетчика (i) и зацикливаясь на нем, мы печатаем их все от 1-й позиции до их конца (NF). Затем с помощью system("sleep 1; clear") часть, мы говорим awk для вызова системных команд на 1 секунду и очистки экрана.


Выше мы отображаем входной файл как слово за словом. Если вы собираетесь отображать его построчно, добавьте IFS=$'\n' в сценарии вроде:

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

И изменить awk команда как:

awk '{ $0; system("sleep 1; clear") }1' read
  • $0 указывает текущую строку. и 1 в конце включает по умолчанию awkкоманда печати.

С bash, Я бы сделал:

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

Используя возврат каретки (\r) вместо перевода строки (\n), вы можете перезаписать текущую строку. -${COLUMNS} дополняет вывод пробелами, так что предыдущие строки полностью перезаписываются.

Я думаю, что для решения по каждому слову необходим двойной цикл:

while read -ra line
do 
    for word in "${line[@]}"
    do
        printf "%-${COLUMNS}s\r" "$word"
        sleep 1
    done
done < file
Другие вопросы по тегам