Skip to content

Instantly share code, notes, and snippets.

@einsitang
Last active November 6, 2025 09:28
Show Gist options
  • Select an option

  • Save einsitang/c7cd24e782031b5e74770242d66b5928 to your computer and use it in GitHub Desktop.

Select an option

Save einsitang/c7cd24e782031b5e74770242d66b5928 to your computer and use it in GitHub Desktop.
短浮点数转换
#!/bin/bash
# 显示用法信息
usage() {
echo "用法: $0 [选项] <文件或目录>"
echo "选项:"
echo " -b, --backup 备份原文件(添加 .bak 后缀)"
echo " -h, --help 显示帮助信息"
exit 1
}
# 检查参数
if [ $# -eq 0 ]; then
usage
fi
backup=0
target=""
# 解析选项
while [ $# -gt 0 ]; do
case "$1" in
-b|--backup)
backup=1
shift
;;
-h|--help)
usage
;;
--)
shift
if [ $# -eq 1 ]; then
target="$1"
else
usage
fi
break
;;
-*)
echo "错误: 未知选项 $1"
usage
;;
*)
target="$1"
shift
;;
esac
done
# 检查目标是否存在
if [ ! -e "$target" ]; then
echo "错误: 目标 '$target' 不存在"
exit 1
fi
# 收集需要处理的文件列表(文本文件)
files=()
if [ -f "$target" ]; then
# 处理单个文件
files+=("$target")
elif [ -d "$target" ]; then
# 处理目录(递归查找所有文本文件,排除二进制文件)
while IFS= read -r -d '' file; do
# 只处理文本文件(排除二进制)
if file --mime-type -b "$file" | grep -q text; then
files+=("$file")
fi
done < <(find "$target" -type f -print0)
else
echo "错误: 目标 '$target' 既不是文件也不是目录"
exit 1
fi
# 格式化小数为4位小数(忽略纯整数)
format_decimals() {
local file="$1"
# 使用awk处理每一行,仅处理带小数点的小数
awk '
{
# 遍历行中的每个字段
for (i=1; i<=NF; i++) {
# 判断是否为带小数点的小数(包含普通小数和科学计数法小数)
# 规则:包含小数点,或科学计数法中指数前有小数部分
if ($i ~ /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?$/ && $i ~ /\./) {
# 转换为4位小数(四舍五入)
$i = sprintf("%.4f", $i)
}
}
# 输出处理后的行
print $0
}' "$file" > "$file.tmp" # 临时文件存储结果
# 替换原文件
if [ $backup -eq 1 ]; then
cp "$file" "$file.bak" # 备份原文件
fi
mv "$file.tmp" "$file"
}
# 批量处理文件
for file in "${files[@]}"; do
echo "处理文件: $file"
format_decimals "$file"
if [ $backup -eq 1 ]; then
echo " 已创建备份: ${file}.bak"
fi
done
echo "所有文件处理完成"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment