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

如何使用awk将CSV文件中指定月份的温度数据按月份分列为多列

解决CSV按月拆分温度数据为多列的问题

你的需求是把2020年4-9月的每日温度从单CSV列拆分成各月独立的列,原来的命令只是把所有月份的数据追加到同一列,显然达不到要求。我们可以用awk通过数组存储各月的每日温度,最后按日期的“日”对齐输出成多列,具体方案如下:

完整的awk脚本解决方案

创建一个脚本文件(比如split-months.awk),内容如下:

BEGIN {
    # 映射目标月份到列索引,按顺序排列
    months["04"] = 1
    months["05"] = 2
    months["06"] = 3
    months["07"] = 4
    months["08"] = 5
    months["09"] = 6
    # 输出表头,对应各月份
    print "April May June July August September"
}

# 处理每一行数据
{
    # 拆分日期字段(格式为YYYY-MM-DD)
    split($1, date_parts, "-")
    year = date_parts[1]
    month = date_parts[2]
    day = date_parts[3]

    # 只处理2020年的目标月份数据
    if (year != "2020" || !(month in months)) {
        next
    }

    # 将温度存入二维数组:键为(日, 列索引),值为温度
    temp[day, months[month]] = $2
}

END {
    # 遍历1到31日,输出对应各月的温度
    for (day_num = 1; day_num <= 31; day_num++) {
        # 把日格式化为两位数字(匹配CSV中的日期格式,比如01、02)
        formatted_day = sprintf("%02d", day_num)
        output_line = ""

        # 按月份顺序拼接每一列的温度
        for (col = 1; col <= 6; col++) {
            if (output_line != "") {
                output_line = output_line " "
            }
            # 如果该日有对应月份的温度则输出,否则留空(可改为"NA"表示缺失)
            output_line = output_line (temp[formatted_day, col] ? temp[formatted_day, col] : "")
        }

        print output_line
    }
}

如何运行

在终端执行以下命令,生成符合要求的temp.csv:

awk -f split-months.awk year-temperatures.csv > temp.csv

脚本说明

  • BEGIN块:提前定义要提取的月份与列的对应关系,同时输出表头(April到September),确保结果格式清晰。
  • 主处理逻辑:拆分日期字段,筛选2020年的目标月份数据,将每日温度存入二维数组,用“日”和“列索引”作为唯一标识,保证同一日的各月温度能对齐。
  • END块:遍历1到31日,按列顺序取出对应温度并拼接成一行输出。对于不存在的日期(比如4月没有31日),对应位置会留空,你可以根据需求修改为"NA"或其他占位符。

这样处理后,temp.csv的每一行对应一个日期的“日”(1-31),每一列对应一个月份的温度,完全符合你想要的格式。

内容的提问来源于stack exchange,提问作者user3296442

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:54:06