You need to enable JavaScript to run this app. 如何用Shell脚本将文件内整数转换为10位ASCII游戏风格统计条
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本将文件内整数转换为10位ASCII游戏风格统计条

原脚本存在的核心问题
  • 读取逻辑完全不匹配多行文件结构:直接将整个文件的多行内容一次性存入intNumber变量,后续seq 1 $intNumber会因为传入的是带换行的多个数值参数,直接触发seq参数报错,无法启动循环。
  • 循环层级错位:没有将「逐行读取每个整数」作为最高优先级的处理步骤,哪怕能正确读取单个整数,第二个循环从$intNumber起始值打印-的逻辑,会导致总长度超出10位的要求——比如n=3时,seq从3遍历到10会生成8个-,拼接3个*总长度达11,不符合固定10位的输出规则。
  • 输出缺少行分隔:所有echo命令都加了-n参数抑制换行,哪怕正确拼接出单条统计条,所有内容都会挤在同一行,无法实现一行对应一个整数的输出要求。
符合需求的实现方案

方案1:纯Shell通用版本(兼容所有POSIX环境)

#!/bin/bash
# 逐行读取目标文件内容
while read -r current_num
do
  # 跳过可能存在的空行
  [ -z "$current_num" ] && continue
  # 生成对应数量的*
  star_part=$(printf '*%.0s' $(seq 1 $current_num))
  # 生成剩余长度的-,总长度固定为10
  dash_part=$(printf '-%.0s' $(seq 1 $((10 - current_num))))
  # 输出单条统计条,自动带行尾换行
  echo "${star_part}${dash_part}"
done < /home/intNumbers.txt

该方案特性:

  • 逐行处理逻辑适配多行文件结构,不会出现一次性读取多值触发的命令报错
  • 精准控制*和-的数量,总长度严格保持10位
  • 输出自动带行分隔,匹配一行一个统计条的要求

方案2:轻量化一行命令实现

awk '{printf "%s%s\n", substr("**********",1,$1), substr("----------",1,10-$1)}' /home/intNumbers.txt

该方案通过直接字符串截取生成统计条,无循环调用开销,处理大文件速度更快。

输出效果验证

针对示例输入:

6
2
3
4
3

两个方案都会生成如下对应输出:

******----
**--------
***-------
****------
***-------

内容的提问来源于stack exchange,提问作者1511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 12:54:03