如何用Bash脚本筛选CSV文件中指定月份的生日数据?
实现方案
下面是完整的脚本实现,能直接达成你想要的功能:
#!/bin/bash # 获取CSV文件路径 echo "Enter csv file" read file # 检查文件是否存在 if [ ! -f "$file" ]; then echo "错误:文件 $file 不存在!" exit 1 fi # 获取月份名称 echo "Enter month" read month # 将月份名称转为两位数字(比如May→05),用C locale确保识别英文月份 month_num=$(LC_ALL=C date -d "$month 1" +%m 2>/dev/null) # 检查月份是否有效 if [ -z "$month_num" ]; then echo "错误:输入的月份名称无效,请输入英文月份名(如May)!" exit 1 fi # 用awk筛选符合条件的记录:拆分第三列的生日,取第5-6位(MM部分)和转换后的月份数字匹配 awk -v month="$month_num" -F',' '$3 ~ "^[0-9]{8}$" && substr($3,5,2) == month' "$file"
关键步骤说明
- 月份转数字:用
LC_ALL=C date -d "$month 1" +%m把输入的英文月份名转成两位数字格式,LC_ALL=C是为了避免系统非英文 locale 无法识别月份名,2>/dev/null用来屏蔽无效月份的错误输出。 - 有效性校验:如果转换后
month_num为空,说明输入的月份无效,直接报错退出。 - 筛选完整记录:你原来的
cut命令只提取了生日字段,没法保留整条用户记录。用awk可以一次性完成字段拆分、格式验证、匹配筛选和结果输出,比管道组合命令更高效可靠——-F','指定逗号为分隔符,$3 ~ "^[0-9]{8}$"先验证生日字段是8位数字(确保格式合规),substr($3,5,2)取生日字段的第5到第6位(也就是MM段),和转换后的月份数字匹配就输出整条记录。
内容的提问来源于stack exchange,提问作者Deezel
相关产品推荐
相关产品推荐

