我如何才能一次打印或显示文本文件中的单词。当我运行脚本时,它应该只逐个显示文本文件中的每个单词,但只显示该单词。
这是我所做的,但它在单独的行上显示每个单词,但它显示了所有单词:
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
您可以在脚本中使用以下命令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
)并循环遍历它,我们将从第一个位置到末尾打印所有内容(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 结尾启用默认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