Last active
November 6, 2025 09:28
-
-
Save einsitang/c7cd24e782031b5e74770242d66b5928 to your computer and use it in GitHub Desktop.
短浮点数转换
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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