命令行下如何将长表转宽表?已尝试csvfix flatten未达预期
命令行实现CSV长表转宽表(解决csvfix flatten不符合预期问题)
问题说明
需要将以下长格式CSV转换为宽格式:
长表示例
Room,"Variable Name",Value Bedroom,Temperature,23 Bedroom,Humidity,78 Office,Temperature,26 Office,Humidity,82 Bathroom,Temperature,18 Bathroom,Humidity,97
目标宽表示例
Room,Temperature,Humidity Bedroom,23,78 Office,26,82 Bathroom,18,97
之前使用csvfix flatten -smq命令得到了不符合预期的结果:
Room,"Variable Name",Value Bedroom,Temperature,23,Humidity,78 Office,Temperature,26,Humidity,82 Bathroom,Temperature,18,Humidity,97
解决方案
方法1:使用csvfix的pivot命令(推荐)
flatten命令仅能将同组行拼接成一行,而**pivot才是专门用于长表转宽表的命令**,执行以下命令即可得到目标格式:
csvfix pivot -f 1 -v 2 -d 3 input.csv
参数解释:
-f 1:指定第1列(Room)作为分组依据-v 2:指定第2列(Variable Name)作为新的列名-d 3:指定第3列(Value)作为对应列名的值
方法2:使用awk命令(无需额外工具)
如果系统未安装csvfix,可以用awk直接处理:
awk -F',' ' NR==1 {next} !seen[$1]++ {rooms[++n]=$1} {vals[$1][$2]=$3} END { printf "Room,Temperature,Humidity\n" for(i=1;i<=n;i++){ printf "%s,%s,%s\n", rooms[i], vals[rooms[i]]["Temperature"], vals[rooms[i]]["Humidity"] } }' input.csv
逻辑说明:
- 跳过表头行,按Room分组存储温度和湿度值
- 最后遍历所有Room,按目标格式输出
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

