9月1号,导出sql文件后,想到了awk,但很复杂。想到了用sed前期处理+python排序比较的区间查重法。编写加调试用了约3小时。

9月2号,编写C代码的sql语句过程中,发现排序可以交mysql,于是,又使用了约一个小时,学习并写出了一句命令行区间查重。

所以,方法不止一种,经验多了,才能快速找到最正确最快的方向。

重点记录第二种方法,此时是9月3号早上了。
一行命令查重:

$ mysql -upublic -ppublic ia_gcms_2014 -e "select Fgcms_product_id, Fissuer_acc_range_low, Fissuer_acc_range_high from t_IP0040T1 order by Fgcms_product_id, Fissuer_acc_range_low" | awk 'NR==1{print};NR>1{if(id==$1 && high>$2) {print ">>> two"; print pre; print;};pre=$0; id=$1; low=$2; high=$3;}'

输出:

Fgcms_product_id    Fissuer_acc_range_low    Fissuer_acc_range_high
>>> two
CIR 5215703100000000000 5215704099999999999
CIR 5215703600000000000 5215704099999999999
>>> two
MCW 5377950000000000000 5377959999999999999
MCW 5377950000500000000 5377950000599999999
>>> two
MPL 5220200000000000000 5220209999999999999
MPL 5220200000300000000 5220200000399999999
>>> two
MRG 5175900000000000000 5175909999999999999
MRG 5175900000200000000 5175900000599999999
>>> two
MRG 5215703100000000000 5215704099999999999
MRG 5215703600000000000 5215704099999999999

注意:上面只能是high>$2, 如果high>=$2不行,实践得知,这是是awk对长整支持不足所致。

$ echo "3560249999999999999 3560250000000000000" | awk '$1<$2{print "true"}' #
$ echo "3560249999999999999 3560250000000000010" | awk '$1<$2{print "true"}' #
$ echo "3560249999999999999 3560250000000000100" | awk '$1<$2{print "true"}' #
$ echo "3560249999999999999 3560250000000001000" | awk '$1<$2{print "true"}' # true

记录到find_cross.sh脚本以便使用

#!/usr/bin/env bash
#coding: utf-8 # filename: find_cross.sh
# description: 数据库区间查重
# note: Fgcms_product_id, Fissuer_acc_range_low复合唯一,排序由mysql做好,awk只要比较前后两行即可。 HOST=localhost
PORT=3306
USER=public
PASSWORD=public
DATABASE=ia_gcms_2014
# 来源表,表名要足够唯一,保证表名字不会被其他词命中,不然会错。
TABLE_SRC=t_IP0040T1
mysql -h${HOST} -P${PORT} -u${USER} -p${PASSWORD} ${DATABASE} \
-e "select Fgcms_product_id, Fissuer_acc_range_low, Fissuer_acc_range_high \
from ${TABLE_SRC} \
order by Fgcms_product_id, Fissuer_acc_range_low" \
| awk 'NR==1{print}; \
NR>1{\
if(id==$1 && high>$2) \
{print ">>> two";print pre; print;} \
pre=$0; id=$1; low=$2; high=$3; \
}'

第一种方法现在看来很笨重,导出数据表到sql文件,再使用sed+python做文本处理。

#!/usr/bin/env python
#-*- coding: utf-8 -*- # 使用:
# mysqldump -upublic -ppublic ia_gcms_2014 t_IP0040T1 > ia_gcms_2014_t_IP0040T1.sql
# sed '/INSERT INTO.*VALUES.*;$/{s/(/\n(/g}' ia_gcms_2014_t_IP0040T1.sql ia_gcms_2014_t_IP0040T1_sed.sql
# python find_cross.py ia_gcms_2014_t_IP0040T1_sed.sql '''
filename: find_cross.py
description: 找出区间交叉的记录
'''
import os, sys
from operator import itemgetter def find_across(filename):
'''
寻交叉区间
'''
sql_file = open(filename, 'r')
# 列表解析,一句抵10句 # with '\n'
tuple_rows = [ eval(line[:-2]) for line in sql_file.readlines()
if line[0]=='(' and line[-3]==')' and line[-2] in (',',';') ] # line[-1]=='\n' tuple_rows.sort(key=lambda x:x[4]) # key=itemgetter(4)
# 不用变成int了,等长就直接比字符串
cmper = lambda a,b:\
-1 if a[4]<b[4] else \
1 if a[4]>b[4] else \
-1 if a[5]<b[2] else \
1 if a[2]>b[5] else \
0
tuple_rows.sort(cmper) # print tuple_rows begin_end = 0
for i in range(len(tuple_rows)-1):
if cmper(tuple_rows[i], tuple_rows[i+1])==0:
if begin_end == 0:
begin_end = 1
print "============== begin =============="
# if tuple_rows[i][4]==tuple_rows[i][4]: # 多余
print tuple_rows[i]
else:
if begin_end == 1:
print tuple_rows[i]
# print "============== end =============="
begin_end = 0
if begin_end == 1:
print tuple_rows[-1]
# print "============== end ==============" if __name__ == "__main__":
if len(sys.argv) < 2:
print "<py> <filename>"
exit(0)
find_across(sys.argv[1])
 

【实习记】2014-09-01从复杂到简单:一行命令区间查重+长整型在awk中的bug的更多相关文章

  1. Cheatsheet: 2014 09.01 ~ 09.30

    Mobile Testing Mobile: Emulators, Simulators And Remote Debugging iOS 8 and iPhone 6 for Web Develop ...

  2. 12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

    电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特 ...

  3. 【实习记】2014-09-26恢复linux下误删的ntfs盘中的文件

        情景,ubuntu下把NTFS格式的盘中的“实习记”文件夹彻底删除了,追毁莫及,粗心觉不是一件好的事情. linux下回复ntfs盘下的文件不能用ext3grep,而使用debugfs命令实在 ...

  4. 调试大叔V1.0.1(2017.09.01)|http/s接口调试、数据分析程序员辅助开发神器

    2017.09.01 - 调试大叔 V1.0.1*支持http/https协议的get/post调试与反馈:*可保存请求协议的记录:*内置一批动态参数,可应用于URL.页头.参数:*可自由管理cook ...

  5. [MVC学习日记]2014/12/01 初步认识MVC模型。

    2014/12/011.初步认识MVC模型.MVC模式是一种表现模式.它将web应用程序分成三个部分,模型(Model).视图(View).控制器(Controller).Model:是实现业务逻辑层 ...

  6. 实习记——《Rethink》

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...

  7. 【实习记】2014-08-18使用curl排错http头的content-length

        总结一,用curl排错Content-Length设置错误,误导了客户端. 访问/cgi-bin/txproj_list时,firebug显示总是不多不少15秒,调试其他问题时郁闷. fire ...

  8. 《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本

    1.Genesis-3D开源游戏引擎主要面向哪些用户人群?有限制吗? 1.我们的引擎没有限制,只要您想了解和使用我们的引擎,就可以加入Genesis-3D的大家庭.2.我们的主要用户群是各个相关的企业 ...

  9. 【实习记】2014-08-19升级vim配置YouCompleteMe并debug的过程+qtcreator有语言包没法换语言

        做了个小项目,有空闲可以做点事了. 偶然查资料看见YouCompleteMe的鼎鼎大名. 演示demo <img src="http://i.imgur.com/0OP4ood ...

随机推荐

  1. Markdown中实现缩进的方法

    markdown中实现缩进的方法 在每一行开头的时候,先输入下面的代码,然后紧跟着输入文本即可.注意有分号. 半角空格:  或   全角空格:  或   不换行空格:  或  

  2. php排序之快速排序

    关于快速排序的介绍 请看百度百科讲解的很详细 http://baike.baidu.com/link?url=1VOpp4qjdwKma81MFPozjvyPy2rYJos6ZmfP5Ady3xjEP ...

  3. MSSQLSERVER数据库- 字符串分割函数返回类型表

    遇到这样一个问题,存储在数据库的数据是一串字符串如:1,2,3,4,5,6.想把这串字符串进行转变成一个表格,如下: 1 2 3 4 5 6 就是这样一个问题,有人同事,写了一个这样的封装函数,这样就 ...

  4. ActiveMQ, Qpid, HornetQ and RabbitMQ in Comparison

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. ubuntu压缩解压

    ubuntu安装解压rar   一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解压.其实在ubuntu下安装rar解压工具是非常简单的,只需要两个步骤就可 ...

  6. Java凝视Override、Deprecated、SuppressWarnings具体解释

    一.什么是凝视     说起凝视,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描写叙述数据的.就象数据表中的字段一样,每一个字段描写叙述了这个字段下的数据的 ...

  7. sed命令详解及应用实例

    第一部分:Sed基本用法 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏 ...

  8. PreferenceActivity 自动保存属性

    package com.example.preference; import android.content.Context; import android.os.Bundle; import and ...

  9. select组件2

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  10. byte数组与对象之间的相互转换

    在进行网络通信时可能需要传输对象,如果用NIO的话,只能用Bytebuffer和channel直接 通过ByteArray*Stream和Object*Stream可以将byte数组和对象进行相互的转 ...