Bash使用for循环逐次打印文件时一次性输出全部内容如何解决
问题原因&解决方案
第一个场景:每3个字段为一组间隔1秒打印
错误原因
你编写的for循环给$(cat output.txt)套了双引号,Bash会把整个文件的内容识别为单个字符串,for循环只会执行1次,直接输出全部内容,和IFS的设置没有关系。
最优解决方案
直接用xargs做字段分组,配合while循环实现:
xargs -n3 < output.txt | while read -r line; do echo "$line" sleep 1 done
xargs -n3会自动把输入的内容按每3个字段拼接为一行,后续while循环逐行读取打印即可。如果需要兼容末尾不足3个字段的场景,这个写法也可以自动处理。
原for循环调整方案
如果要沿用for循环写法,可以加计数器做字段分组:
count=0 temp=() for field in $(cat output.txt); do temp+=("$field") count=$((count+1)) if [ $count -eq 3 ]; then echo "${temp[@]}" temp=() count=0 sleep 1 fi done # 处理末尾不足3个的剩余字段 if [ ${#temp[@]} -gt 0 ]; then echo "${temp[@]}" fi
第二个场景:从后往前逐行取第二个字段打印
错误原因
你编写的for循环的迭代对象只有wc -l返回的总行数值这一个元素,所以只会执行1次,达不到逐次迭代的效果。
调整后代码
# 先取文件总行数 total_lines=$(wc -l < output.txt) # 从总行数倒序遍历到1 for ((i=total_lines; i>=1; i--)); do awk '{ print $2 }' output.txt | tail -n$i | head -n1 sleep 1 done
内容的提问来源于stack exchange,提问作者user911729
相关产品推荐
相关产品推荐

