如何在类Unix命令行下读取原始4字节浮点文件并打印指定范围数值?
实现方案
方案1:使用系统预装od命令(无额外依赖)
od是所有类Unix系统默认自带的二进制内容解析工具,直接用如下命令即可:
# 替换n1、n2为实际的起止序号,替换binary_float.bin为你的文件名 od -An -f -j $((4*(n1-1))) -N $((4*(n2 - n1 + 1))) binary_float.bin
参数说明:
-An:关闭左侧的偏移地址输出,只打印浮点数本身-f:将二进制内容按原生系统字节序解析为4字节单精度浮点数-j:跳过文件开头的指定字节数,这里跳过前n1-1个浮点数对应的字节-N:仅读取指定长度的字节,这里读取n2-n1+1个浮点数对应的总字节
如果你的文件字节序和当前系统不匹配,可以替换-f参数手动指定字节序:
- 小端序4字节浮点数:替换为
-t f4le - 大端序4字节浮点数:替换为
-t f4be
方案2:使用Python单行命令(灵活性更高)
如果你的环境有Python3,用Python解析可以更方便地自定义字节序、输出格式:
# 示例中3为n1,7为n2,binary_float.bin为文件名,按需替换 # 格式串开头的<代表小端序,大端序请改为> python3 -c "import sys,struct; n1=int(sys.argv[1]); n2=int(sys.argv[2]); data=open(sys.argv[3],'rb').read()[4*(n1-1):4*n2]; print('\n'.join(map(lambda x:f'{x:.6f}', struct.unpack('<'+'f'*(n2-n1+1), data))))" 3 7 binary_float.bin
你可以自行修改f'{x:.6f}'部分调整输出的小数位数,比如改成f'{x:.2f}'就是保留2位小数。
注意事项
- 上述两种方案默认
n1、n2都是从1开始计数,符合常规的“第N个”的计数习惯 - 解析前请确认文件存储的浮点数字节序,参数不匹配会得到错误的输出结果
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

