如何将文件大小转换为易读格式并与其他列共同打印输出
解决方案
你之前的命令存在两个核心问题:一是仅输出了第5列内容,未保留其他需要的字段;二是写法在逐行处理时容易产生额外进程开销,不适合大数据量场景。以下是两种适配你需求的高性能方案:
方案1:使用numfmt指定字段转换(写法最简)
numfmt本身支持直接指定要转换的列,全程仅启动一次进程,无重复fork开销,和你预期的SI单位(1000进位)计算逻辑完全匹配:
# 把前面的ls -l | tail -n +2替换成你的实际业务输入流即可 ls -l | tail -n +2 | numfmt --field=5 --to=si --padding=4 | awk '{printf "%s %-4s %s\n", $1, $5, $NF}'
参数说明:
--field=5:指定仅转换输入的第5列内容,其他列原样保留--to=si:按1000进位转换(280000→280K、2800000→2.8M),如果需要1024进位的二进制单位可替换为--to=iec--padding=4+ awk的格式化输出:保证大小列对齐,和你给出的示例输出格式完全一致
方案2:纯awk内置计算(性能最高)
全程不调用任何外部命令,所有计算在awk进程内完成,是超大数据量场景下的最优选择:
ls -l | tail -n +2 | awk ' function hsize(bytes, uidx, units) { split("K M G T P", units, " ") uidx = 0 while (bytes >= 1000 && uidx < 5) { bytes /= 1000 uidx++ } if (uidx == 0) return bytes "B" return (bytes == int(bytes) ? int(bytes) : sprintf("%.1f", bytes)) units[uidx] } { s = hsize($5) printf "%s %-4s %s\n", $1, s, $NF }'
两种方案执行后输出和你给出的预期效果完全一致:
-rw-rw-r-- 280K demo1 -rw-rw-r-- 2.8M demo2 -rw-rw-r-- 28M demo3
注:示例中用
ls -l作为输入源,实际使用时直接替换为你的业务命令输出流即可,不需要修改后续处理逻辑。
内容的提问来源于stack exchange,提问作者Bhagyaraj Haranale IN
相关产品推荐
相关产品推荐

