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


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

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

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!

5
2018-03-21 15:58


происхождения


Я уверен, что вы можете написать awk-скрипт для этого - Panther


ответы:


Вы можете использовать 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 on end позволяет использовать по умолчанию awk«s Распечатать команда.

4
2018-03-21 17:16



Спасибо, это решило мою проблему. Можете ли вы также рассказать мне, как мне отображать 120 или более слов за одну минуту! - Hassen Fatima
@HassenFatima уменьшает вторую до низкой единицы на sleep .1 (это означает каждое слово / линию за 1/10 секунды) или sleep .001 (означает каждое слово / линию в 1/1000 секунд) и ниже на .00000000000 ... 1 - αғsнιη


С 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

4
2018-03-21 18:05



Я думал, что входной файл OP содержит более одного слова в каждой строке: / - αғsнιη
@KasiyA Хммм. Я предположил, что ОП означает IFS и не FS в первой строке, и в этом случае она идет по строкам. - muru
Но ваш скрипт не удастся, если первое слово в первой строке было длинным, а второе слово в следующей строке было маленьким, чем предыдущая строка. запустите свой скрипт этот ввод в качестве примера - αғsнιη
@ KasiyA исправил это. - muru