本文是关于Linux中的文本处理三剑客(grep,sed,awk),以及正则表达式应用的一个样例,获取北京某时刻PM2.5的数据,然后进行处理,输出到csv文件中,并画图表展示。

一、题目要求:

从因特网上搜索 Web 页,用 wget 获取网页,处理网页 html 文本数据,从中提取出当前时间点北京各监测站的 PM2.5 浓度,输出如下 CSV 格式数据:
2020 03 09 13:00:00, 海淀区万柳 ,73
2020 03 09 13:00:00, 昌平镇 ,67
2020 03 09 13:00:00, 奥体中心 ,66
2020 03 09 13:00:00, 海淀区万柳 ,73
2020 03 09 13:00:00, 昌平镇 ,73
2020 03 09 13:00:00, 奥体中心 ,75

撰写实验报告,要求:写出对数据的分析和处理思路,列出各个处理步骤并给出解释。

二、详细步骤:

  1. 从因特网上搜索 Web 页,找到与含有北京各监测站的 PM2.5 浓度的网站,我找到了**绿色呼吸网**,网站如下:

    1
  2. 使用**Xshell**登录到Ubuntu服务器:

    2 3
  3. 使用**wget**命令获取该网页:

    1
    wget http://www.pm25.com/city/beijing.html
    4
  4. 使用**cat**命令查看该网页的内容:

    1
    cat beijing.html | more
    5

    我们关注的内容:

    ​ ①数据更新的时间:

    6

    ​ ②各监测点PM2.5浓度数据:

    7
  5. 发现时间的地方有个*“更新时间:”**,监测点名称的地方都有“pjadt_location”*,而PM2.5浓度的地方都有**“pjadt_pm25”。根据这个特性,先使用*awk**命令将需要的行保留下来。下面先进行编写1.awk***:

    1
    vim 1.awk

    8

    运行以下命令,对所需行进行过滤:

    1
    cat beijing.html | awk -f 1.awk | more
    9

    发现除了我们想要的行还多出了这几行:

    10

    经过观察,发现*“PM2.5”**浓度这一行与我们所需的行的区别是,我们所需的行有μg*,而**“PM2.5”浓度这一行没有:

    11

    我们重新对*“1.awk”**进行编辑,直接将“监测站点”*这一行排除,并且对**“PM2.5”浓度这一行采用额外的过滤规则:

    12

    重新运行以下命令,对所需行进行过滤:

    1
    cat beijing.html | awk -f 1.awk | more
    13

    发现已经筛选出了所需要的行。

  6. 现在再利用*sed**命令将html标签”<>“*中的内容和**“更新时间:”这个无用的信息删除:

    1
    cat beijing.html | awk -f 1.awk | sed -e 's/<[^<>]*>//g' -e 's/更新时间://g' | more
    14

    发现已经只剩余我们想要的数据。

  7. 但是这些数据不在同一行,且没有明显特征,无法进行*awk**命令,因此先使用tr***命令将这些行合并为一行,以空格分隔:

    1
    cat beijing.html | awk -f 1.awk | sed -e 's/<[^<>]*>//g' -e 's/更新时间://g' | tr '\n' ' ' | more
    15
  8. 最后利用*awk**命令将所需内容规格化输出即可,先编辑“2.awk”***:

    1
    vim 2.awk
    16

    利用*for**循环输出,NF*为列数,刚好循环$$(NF-2)/4$$次,第一个**%s为*日期**,第二个%s*为**时间,第三个*%s**监测点名称*,第四个**%s为*PM2.5浓度**,再运行以下awk***命令,即可得到格式化的输出:

    1
    cat beijing.html | awk -f 1.awk | sed -e 's/<[^<>]*>//g' -e 's/更新时间://g' | tr '\n' ' ' | awk -f 2.awk  | more
    17

    发现输出已经符合题目要求。

  9. 将结果重定向到文件**“beijing.csv”**

    1
    2
    cat beijing.html | awk -f 1.awk | sed -e 's/<[^<>]*>//g' -e 's/更新时间://g' | tr '\n' ' ' | awk -f 2.awk  > beijing.csv
    vim beijing.csv
    18 19
  10. 将*beijing.csv**发送到电脑,并将编码转为ANSI***:

20
  1. 由于不同时间的数据有所不同,因此我的过滤语句考虑了不同时间点的情况*(北京一共有12个监测点,有时有的监测点没有数据,因此是只有11个监测点的数据)**,直接运行以下命令就可以直接将数据导出为beijing.csv***,以下为另一时间点的数据情况:

    1
    2
    wget http://www.pm25.com/city/beijing.html
    cat beijing.html | awk -f 1.awk | sed -e 's/<[^<>]*>//g' -e 's/更新时间://g' | tr '\n' ' ' | awk -f 2.awk > beijing.csv
    21

三、总结

本文以一个样例,详细介绍了Linux中的文本处理三剑客(grep,sed,awk),以及正则表达式的相关知识,希望对你的Linux学习有所帮助。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒...