免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: onlinedog
打印 上一主题 下一主题

[文本处理] 帮忙处理一个文本(在线等) [复制链接]

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
11 [报告]
发表于 2014-05-06 10:16 |只看该作者
回复 8# Herowinter

标准的 sql 中, where 后面的表名, 一定要先出现在 from 后面. 除非中间还有 join .

所以, 实际上只是需要 from 后 where 之前的这部分内容.

就楼主的例子, 应该就是这样. 但如果还有 alias, 那可能还需要一点点后期的工作才能处理好.
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
12 [报告]
发表于 2014-05-06 10:21 |只看该作者
回复 11# q1208c
恩,我写的代码就是取from和where之间的字符串去掉了别名。


   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
13 [报告]
发表于 2014-05-06 10:25 |只看该作者
熟悉SQL语法的都知道,别名是as
比如

select aa from table as t where Conditions

无非是from as where 做FS自己数一下filed就可以过滤出来了。

把所有的SQL statements贴出来吧,不是难事,awk搞掂。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
14 [报告]
发表于 2014-05-06 10:32 |只看该作者
回复 13# expert1


有些人不写 as 的, 因为有些数据库不让用 as. 我就被坑过. 说我语法错误, NND. 找了半天才知道不能用 as.     

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
15 [报告]
发表于 2014-05-06 10:40 |只看该作者
回复 14# q1208c


    code monkey的垃圾习惯非常不好,留给你一堆坑让你填写,本来标准化就是as的。这就是为什么要标准化,代码风格一样,否则擦屁股的人会很头疼的。

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
16 [报告]
发表于 2014-05-06 11:28 |只看该作者
  1. awk '{gsub(/[,;]/," , ");a=b=0;for(i=1;i<=NF;i++){s=(a*(1-b)==1)?$i:"";a=(toupper($i)=="FROM")?1:(toupper($i)=="WHERE")?0:a;b=(s=="")?0:(s==",")?0:1;s=(s==","|| a==0)?"":s;if (s!="") print s}}' test
复制代码
test
  1. select * from  表1 ;
  2. select a,b,c from  表2,  表3 where 表2.字段=表3.字段;
  3. select * from 表4;
  4. select a,b,c from  表5,  表6 where 表5.字段=表6.字段;
  5. select a,b,c from  表7 别名7,   表8  别名8 where 别名7.字段=别名8.字段;
复制代码
result
  1. 表1
  2. 表2
  3. 表3
  4. 表4
  5. 表5
  6. 表6
  7. 表7
  8. 表8
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
17 [报告]
发表于 2014-05-06 15:15 |只看该作者
解决SQL中有AS语法解析
  1. awk '{t="";gsub(/[,;]/," , ");a=b=0;for(i=1;i<=NF;i++){s=$i;a=(toupper(s)=="FROM")?1:(toupper(s)=="WHERE")?0:a;s=(toupper(s)!="FROM"&&a>0&&b<1&&s!=",")?s:"";b=($i==",")?0:(s!="")?1:b;t=(s!="")?t""s",":t};print substr(t,1,length(t)-1)}' test
复制代码
test
  1. select * from  表1 ;
  2. select a,b,c from  表2,  表3 where 表2.字段=表3.字段;
  3. select * from 表4;
  4. select a,b,c from  表5,  表6 where 表5.字段=表6.字段;
  5. select a,b,c from  表7 别名7,   表8 As 别名8 where 别名7.字段=别名8.字段;
复制代码
results
  1. 表1
  2. 表2,表3
  3. 表4
  4. 表5,表6
  5. 表7,表8
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
18 [报告]
发表于 2014-05-06 15:31 |只看该作者
再改进正确解析JOIN和AS关键字
  1. awk '{t="";gsub(/[,;]/," , ");a=b=0;for(i=1;i<=NF;i++){s=$i;a=(toupper(s)=="FROM")?1:(toupper(s)=="WHERE")?0:a;s=(toupper(s)!="FROM"&&a>0&&b<1&&s!=",")?s:"";b=($i==","||toupper($i)=="JOIN")?0:(s!="")?1:b;t=(s!="")?t""s",":t};print substr(t,1,length(t)-1)}' test
复制代码
test
  1. > more test
  2. select * from  表1 ;
  3. select a,b,c from  表2,  表3 where 表2.字段=表3.字段;
  4. select * from 表4;
  5. select a,b,c from  表5,  表6 where 表5.字段=表6.字段;
  6. select a,b,c from  表7 别名7,   表8 as 别名8 where 别名7.字段=别名8.字段;
  7. select a,b,c from  表9 别名9 inner join     表A as 别名A on 别名9.字段=别名A.字
  8. 段;
复制代码
results
  1. 表1
  2. 表2,表3
  3. 表4
  4. 表5,表6
  5. 表7,表8
  6. 表9,表A
复制代码

论坛徽章:
3
巳蛇
日期:2014-04-24 17:25:352015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03
19 [报告]
发表于 2014-05-08 14:12 |只看该作者
awk 以空格做分隔符,取$4不行吗?

论坛徽章:
0
20 [报告]
发表于 2014-05-08 17:07 |只看该作者
本帖最后由 todayhero 于 2014-05-08 17:08 编辑

差不多看个
  1. sed -e 's/sele.* from *//g' -e "s/where.*;//g" -e "s/;//g"  YRFILE
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP