Печатать только одну строку за раз из текстового файла
Как я могу печатать или отображать только слова из текстового файла одновременно. Когда я запускаю свой скрипт, он должен отображать только каждое слово из текстового файла одно за другим, а отображать только это слово.
Это то, что я сделал, но оно отображает каждое слово в отдельной строке, но показывает все из них:
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