如何使用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
相关产品推荐
相关产品推荐

