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

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

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

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! 

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

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

Объяснение:

Команда sleep выполняет задержку в течение определенного времени (в секундах). С задержкой 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