You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:13:30