Bash脚本大文件拆分:如何不使用case语句实现该功能
不用case语句实现Bash大文件拆分
你的case语句实现虽然可行,但当需要扩展更多拆分选项时,代码会变得冗长。可以用Bash关联数组来替代case分支,让代码更简洁易维护,同时完全满足大文件(比如3000万行的数据库文件)的拆分需求。
优化后的脚本代码
#!/bin/bash # 提示输入文件路径 echo "请输入要拆分的文件路径:" read pathOfFile # 检查文件是否存在 if [ ! -f "$pathOfFile" ]; then echo "错误:指定的文件不存在!" exit 1 fi # 统计文件总行数 countLines=$(wc -l < "$pathOfFile") echo "该文件共有 $countLines 行" # 定义选项与拆分文件数的映射(替代case分支) declare -A split_options=( ["a"]=2 ["b"]=3 ["c"]=4 ["d"]=5 ["e"]=10 ["f"]=25 ) # 显示可选拆分方案 echo -e "\n请选择拆分的文件数量:" for opt in "${!split_options[@]}"; do echo "$opt = ${split_options[$opt]} 个文件" done read numberOfFiles # 验证输入是否有效 if [ -z "${split_options[$numberOfFiles]}" ]; then echo "无效选项,请重新运行脚本并选择正确的选项。" exit 1 fi # 提示输入拆分后文件的前缀名 echo -e "\n请输入拆分后文件的前缀名:" read nameForFiles # 计算每个拆分文件的行数 lines_per_file=$((countLines / split_options[$numberOfFiles])) # 执行拆分操作 split -l "$lines_per_file" "$pathOfFile" "$nameForFiles" echo "拆分完成!生成的文件以 $nameForFiles 为前缀。"
关键改进点
- 关联数组映射:用
declare -A定义关联数组,将选项a-f直接映射到对应的文件数,避免了重复的case分支,后续新增选项只需在数组里添加键值对即可。 - 输入验证:增加了文件存在性检查和选项有效性验证,避免因无效输入导致脚本报错。
- 代码可读性:循环遍历数组显示可选方案,比硬编码echo更简洁,也避免了手动维护重复的提示文本。
针对超大文件的额外建议
对于3000万行的数据库文件,还可以直接使用split的-n参数按文件数拆分,无需手动计算行数,效率更高:
# 直接按指定文件数拆分,无需提前统计总行数 split -n l/${split_options[$numberOfFiles]} "$pathOfFile" "$nameForFiles"
其中l/表示按行拆分,split -n l/5会将文件平均拆分为5个文件,剩余的行自动分配到最后一个文件中。
内容的提问来源于stack exchange,提问作者CrazyCat
相关产品推荐
相关产品推荐

