每次只打印文本文件中的一行

每次只打印文本文件中的一行

我如何才能一次打印或显示文本文件中的单词。当我运行脚本时,它应该只逐个显示文本文件中的每个单词,但只显示该单词。

这是我所做的,但它在单独的行上显示每个单词,但它显示了所有单词:

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!

答案1

您可以在脚本中使用以下命令sleepclear

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

解释:

在 中awkNF指定字段总数在当前输入记录/行中,因此通过使用变量作为计数器(i)并循环遍历它,我们将从第一个位置到末尾打印所有内容(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指定当前行。并且1on 结尾启用默认awk打印命令。

答案2

使用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

相关内容