用Shell与Excel处理我的2018年个人数据
用Shell与Excel处理我的2018年个人数据
2018年,曾小满的盒子个人数据整理过程记录。
编辑中 / "开发人员的记事本" / 2周前 更新 · 2019-01-01 创建

导出数据

通过在MySQL数据的库建立视图,我把的我的2018年个人数据导出成了一份Excel格式的文件

image.png

image.png

这张Excel表格以行的形式记录了我的每一天,以列记录了每一天具体事项的相关记录。

表中有如下字段:

date 日期

weather 天气

location 地点

people 人物

wakeupTime 起床时间

sleepTime 睡觉时间

step 步数

event 事件

mood 心情

movement 常规活动

weight 体重

food 食物

为了方便后续步骤的使用,我把Excel文件又导出为了纯文本TXT格式。

image.png

哈哈,一年的生活也就在这143kb中。

数据分项

处理编码问题

这次打算通过Shell来处理这批数据,就搬出了WIN10的子系统Ubutu,好处是不用开虚拟机还可以与Winodws系统共享同一空间的文件。

进入子系统后一路cd到目标文件夹:

image.png

通过 cat命令 查看下这份文件在Shell环境下是否能够正确打开,果不其然是乱码,这是由于EXCEL导出默认编码格式和BOM头的原因导致的。

image.png

出现这样的情况我们只需要重新保存为UTF-8编码格式即可。

接下来,我们对数据进行分表存储,方便后面针对不同的字段进行数据处理。

数据分项处理

cat 2018DayData.txt 
| awk -F '   ' '{print $1"\t"$2}'
| sed '1d'
> 2018DayData_wather.txt

# 管道1 以制表符分割 输出第一列和第二列的内容以制表符分割
# 管道2 通过sed命令删除第一行表头内容
# 输出 weather列数据到当前文件夹你

如法炮制,我们将后面几项数据列(字段)也按照这种方式输出成单独的文件。

image.png

image.png

image.png

最终我们就得到了这样几份数据文件。

单项数据处理

食物数据

首先我想处理的是与食物相关的数据,毕竟食物给我提供每一天的能量。

以下是食物数据文件 “2018DayData_food.txt” 的基本格式:

image.png

食物Wordcount:

通过WordCount的步骤可以了解我每一项食物在我今年记录中的出现频次。

cat 2018DayData_food.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/food_wordcount.txt

# 管道1 awk命令 只取第二列数据列
# 管道2 sed命令 全局替换删除空格和"号
# 管道3 sed命令 全局替换,为回车分行,让每一个食物名称单独占据一行以便后续步骤操作
# 管道4 sort命令 -k(key)参数用于指定按照第1列排序(虽然这里只有一列)
# 管道5 uniq命令 -c(count)在每列旁边显示该行重复出现的次数
# 管道6 awk命令 自定义uniq命令处理后的行数据显示形式(食物名称在前,频度在后)
# 管道7 sort命令 -k参数用于按照第二列食物频度进行排序;-n是按照数字大小排序;-r是以相反顺序排

wordCount得到如下格式结果:

米饭    236
柠檬水  95
包子    60
牛肉    51
土豆    48
酸奶    42
酱肉包  42
顺旺基  39
苏打饼干        38
银耳汤  35

地点数据

地点WordCount,如法炮制,细节不再详述。

cat 2018DayData_site.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/food_wordcount.txt
中洲锦城湖岸	189
天府新谷	104
寝室	99
桂溪生态公园	55
C教	43
健身房	37
家	35
环球中心	31
六食堂	27
航天城上城	22

人物数据

地点WordCount,如法炮制,细节不再详述。

cat 2018DayData_people.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/people_wordcount.txt

wordcount结果如下:

王治文	277
*郑世睿	143
杨坤	95
王钰松	94
郑世睿	85
*曾钰杰	75
兰玉	75
*马洪俊	64
*杨坤	42
胡鋼	39

*号代表没有见面但是通过网络或电话进行较长时间沟通和通讯过。

周期运动

地点WordCount,如法炮制,细节不再详述。

cat 2018DayData_people.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/people_wordcount.txt

wordcount结果如下:

午休    301
写代码  225
学习    118
工作    99
外出    87
运动    85
跑步    84
休息    72
骑车    69
健走    44

步数数据

通过EXCEL中的AVERAGE、MAX、MIN函数可以找到三项数据:

平均每日行走步数 8803.51
步数最多的一天数量 24223
步数最少的一天数量 266

通过数据透视图可以看到每个月的总步数,通过折线图可以将全年行走步数的频率绘制出来:

image.png

体重数据

因为不是每一天都有条件称体重,我将空的体重数据进行剔除,用Excel的定位查找功能很容易剔除这部分空数据。

image.png

image.png

再用右键在弹出的菜单中选择删除,删除整行。

image.png

接下来就按照我的意向来做最激动人心的计算:

全年体重最大差值 25.9
第一天与最后一天体重差值 -20

image.png

睡眠数据

睡眠数据我借助Excel来处理:

我想统计起床和入睡时间,先把时间数据进行格式处理,通过设置自定义单元格格式只保留h字符,即小时。

image.png

处理后形成如下数据格式:

image.png

接下来对起床时间和睡眠时间做直方图用以显示数据出现频次:

image.png

通过调整坐标轴选项设定箱宽度为1,这样就能直观地看到以每个小时为划分的入睡时间和起床时间的图表。

情绪数据

情绪WordCount,如法炮制,细节不再详述。

cat 2018DayData_mood.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/mood_wordcount.txt

wordcount结果如下:

平静    310
开心    34
轻松    31
烦躁    29
郁闷    11
焦虑    10
激动    9
难过    7
难受    7
纠结    7

体感数据

体感WordCount,如法炮制,细节不再详述。

cat 2018DayData_weather.txt 
| awk -F ' ' '{print $2}' 
| sed 's|[" ]||g' 
| sed 's|,|\n|g'
| sort -k 1 
| uniq -c 
| awk '{print $2"\t"$1}' 
| sort -k 2 -nr 
> output/mood_weather.txt

wordcount结果如下:

寒冷    164
炎热    32
热      26
凉爽    26
小雨    19
闷热    16
湿热    16
下雨    16
中雨    7
阴      6
留声机

正在加载验证码...