记录——使用命令对比两个大量数据文本的内容是否相同的

使用命令对比两个大量数据文本的内容是否相同的记录

需求

DB中有一份数据,有|time|sum|的两列数据,ES查询出来的json格式结果,也是包含time与sum两个结果。现需要对比二者的数据中time-sum是否能一一匹配,因为数据量较大,不适合人工一条条的去对,所以需要使用一些工具来实现。

数据举例,

DB:

time sum
121212121212 333
121212121213 666

ES:

{
  "took": 12558,
  "timed_out": false,
  "_shards": {
    "total": 2090,
    "successful": 2090,
    "skipped": 1940,
    "failed": 0
  },
  "hits": {
    "total": 5582253,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "appId": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "kkkkkkk",
          "doc_count": 5582253,
          "count": {
            "buckets": [
              {
                "key_as_string": "2019-08-29 13:45:00",
                "key": 1567086300000,
                "doc_count": 8405,
                "rc": {
                  "value": 8405
                }
              },
              {
                "key_as_string": "2019-08-29 13:46:00",
                "key": 1567086360000,
                "doc_count": 7687,
                "rc": {
                  "value": 7687
                }
              }
              ...

ps:可以看到aggregations->appId->buckets[0]->count->buckets[0]下的key为time,doc_count为sum,除了这些还有许多无用的数据。

步骤

保存数据到本地

es,直接采用将查询结果保存到本地的方式

db,写一个sql,导出CSV格式的数据

select  UNIX_TIMESTAMP(STR_TO_DATE(convert(c_time,char),"%y%m%d%H%i")) * 1000, sum(c_count) from table where c_app_id = "kkkkkkkkk" and c_type = 0 and c_time >= 1908292145 and c_time < 1908300945 group by c_app_id, c_time

首先将c_time从int convert成字符串,然后使用str_to_date函数,将字符串解析成日期类型,然后使用unix_timestamp转成时间戳。

这里介绍一下MySQL中几个时间函数

  • unix时间戳是一种时间表示方式,定义为从格林尼治时间1970年01月01日00时00分00秒起至现在的总秒数

  • from_unixtime(unix_timestamp,format)

    • 这里的unix_timestamp为需要处理的时间戳(该参数为Unix时间戳),也可以是字段名,也可以是UNIX时间戳字符串,format为需要转换的格式。该函数可以将unix时间戳转换成可以人类可以看懂的格式。
  • unix_timestamp([date])

    • 将日期转换成unix时间戳
  • timestamp(expression, interval)

    • 单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和

数据清洗

发现db的CSV还算干净,所以需要着重去清洗es跟db的格式一致。

以下是es数据的清洗过程

清除掉空格

使用vim的全局替换功能

语法为:%s/ //g

解释:语法为:%s/old/new/g,其中s代表替换模式,old代表要替换的字符串,new代表新的字符串,因为他是一行一行处理的,g代表global,对一行的所有都替换,不带g则只对一行中搜到的第一个old进行替换的。%处可以填行号,代表对某一行进行修改,%代表对所有行修改。

全局替换文章传送点此处

####将"key":1567129260000,“doc_count”:8233,搞到同一行

也是使用vim的全局替换功能

命令为:%s/,\n"doc_count/,"doc_count/g

其中\n为换行符。

关于换行符在不同系统中的表示

  • windows中是\r\n
  • linux是\n
  • mac是\r

洗掉其他数据,只保留"key":1567129260000,“doc_count”:8233,

这里使用grep管道抽取数据后放到一个新文件中

  • 命令head -n filename表示查看头n行的数据
  • 命令wc filename表示查看文件有几行数据
  • grep “doc_count”,grep也是按照行来寻找的,寻找包含了目标字段的行,我们需要将包含”\“doc_count\”“的行输出到一个新文件中去

所以命令为grep “\“doc_count\”” > tmp.log.es.clean

再次清洗数据"key"等字段

还是使用vim的全局替换功能

将数据清洗成这样的

1567086300000,8405
1567086300000,8406
...

使用diff进行最后的对比

diff file1 file2

diff命令用于比较文件的差异。

diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

如果没有返回数据则证明两个文件一样,对比成功了。

拓展命令

  • 命令输出错了,需要重输,按ctrl + w一段一段的删除
  • vim快速翻页
    • 整页翻页 ctrl f ctrl d f-forward,d-backward
    • 半页翻页 ctrl d ctrl u d-down,u-up
    • 滚一行 ctrl e ctrl y
    • zz 让光标所在行居屏幕中央
    • zt t代表top,让光标所在行居顶
    • zb b代表bottom,让光标所在行居低
  • vim清除一个文件中的内容
    • :%d
  • awk是一个强大的文本分析工具
    • -F ‘:’,代表以什么为分隔符,默认为空格
    • awk -F ‘:’ ‘{print $1 $2}’,注意有花括号,代表按照’:'分割每一行后,输出第一列和第二列,且中间有空格
    • awk -F ‘:’ ‘{print $1","$2}’,加上"","“可以输出第一列第二列中间有一个”,"。

你可能感兴趣的:(linux)