免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3240 | 回复: 15

[文本处理] 小弟愚笨,求解文本处理awk之SQL语句 [复制链接]

论坛徽章:
0
发表于 2013-01-18 17:45 |显示全部楼层
小弟真是愚笨啊,一直学不好AWK,现在着急交差,求各路大侠帮一下 解题

题目如下:
ALTER TABLE V3X_BBS_ARTICLE
RENAME TO BBS_ARTICLE,
CHANGE CLICK_NUMBER CLICK_NUMBER SMALLINT DEFAULT 0,
CHANGE ISSUE_TIME ISSUE_TIME DATETIME NOT NULL DEFAULT '2000-01-01 00:00:00',
CHANGE ELITE_FLAG ELITE_FLAG SMALLINT,
CHANGE RESOURCE_FLAG RESOURCE_FLAG SMALLINT,
CHANGE ANONYMOUS_FLAG ANONYMOUS_FLAG SMALLINT,
CHANGE ANONYMOUS_REPLY_FLAG ANONYMOUS_REPLY_FLAG SMALLINT,
CHANGE MESSAGE_NOTIFY_FLAG MESSAGE_NOTIFY_FLAG SMALLINT,
CHANGE TOP_SEQUENCE TOP_SEQUENCE SMALLINT,
CHANGE PP_STATE STATE SMALLINT,
CHANGE REPLY_NUMBER REPLY_NUMBER SMALLINT,
CHANGE MODIFY_TIME MODIFY_TIME DATETIME DEFAULT '2000-01-01 00:00:00';

ALTER TABLE BUL_DATA
CHANGE TITLE TITLE VARCHAR(1024) NOT NULL,
CHANGE KEYWORDS KEYWORDS VARCHAR(500),
CHANGE CREATE_DATE CREATE_DATE DATETIME DEFAULT '2000-01-01 00:00:00' NOT NULL,
CHANGE AUDIT_DATE AUDIT_DATE DATETIME DEFAULT '2000-01-01 00:00:00',
CHANGE PUBLISH_DATE PUBLISH_DATE DATETIME DEFAULT '2000-01-01 00:00:00',
CHANGE PIGEONHOLE_DATE PIGEONHOLE_DATE DATETIME DEFAULT '2000-01-01 00:00:00',
CHANGE UPDATE_DATE UPDATE_DATE DATETIME DEFAULT '2000-01-01 00:00:00',
CHANGE READ_COUNT READ_COUNT SMALLINT DEFAULT 0,
CHANGE TOP_ORDER TOP_ORDER SMALLINT NOT NULL DEFAULT 0,
CHANGE PP_STATE STATE SMALLINT NOT NULL,
CHANGE DELETED_FLAG DELETED_FLAG SMALLINT NOT NULL DEFAULT 0,
CHANGE ATT_FLAG ATT_FLAG SMALLINT;

以上是MYSQL SQL语句,想要转成ORACLE的ALTER 语句,因为MYSQL 与ORACLE的执行ALTER语句是不同的,而且ORACLE碰到RENAME之类的还要单独写成一条ALTER TABLE语句。

所以改完后应该如下:

ALTER TABLE V3X_BBS_ARTICLE RENAME  MODIFY CLICK_NUMBER SMALLINT DEFAULT 0
MODIFY ISSUE_TIME DATETIME NOT NULL DEFAULT '2000-01-01 00:00:00'
MODIFY ELITE_FLAG SMALLINT
MODIFY RESOURCE_FLAG SMALLINT
MODIFY ANONYMOUS_FLAG SMALLINT
MODIFY ANONYMOUS_REPLY_FLAG SMALLINT
MODIFY MESSAGE_NOTIFY_FLAG SMALLINT
MODIFY TOP_SEQUENCE SMALLINT
MODIFY PP_STATE SMALLINT
MODIFY REPLY_NUMBER SMALLINT
MODIFY MODIFY_TIME DATETIME DEFAULT '2000-01-01 00:00:00';
ALTER TABLE V3X_BBS_ARTICLE RENAME COLUMN PP_STATE TO STATE;
ALTER TABLE V3X_BBS_ARTICLE RENAME TO BBS_ARTICLE;


ALTER TABLE BUL_DATA
MODIFY TITLE TITLE VARCHAR(1024) NOT NULL
MODIFY KEYWORDS VARCHAR(500)
MODIFY CREATE_DATE DATETIME DEFAULT '2000-01-01 00:00:00' NOT NULL
MODIFY AUDIT_DATE DATETIME DEFAULT '2000-01-01 00:00:00'
MODIFY PUBLISH_DATE DATETIME DEFAULT '2000-01-01 00:00:00'
MODIFY PIGEONHOLE_DATE DATETIME DEFAULT '2000-01-01 00:00:00'
MODIFY UPDATE_DATE DATETIME DEFAULT '2000-01-01 00:00:00'
MODIFY READ_COUNT SMALLINT DEFAULT 0
MODIFY TOP_ORDER SMALLINT NOT NULL DEFAULT 0
MODIFY PP_STATE SMALLINT NOT NULL
MODIFY DELETED_FLAG SMALLINT NOT NULL DEFAULT 0
MODIFY ATT_FLAG SMALLINT;
ALTER TABLE BUL_DATA RENAME COLUMN PP_STATE TO STATE;

有1000多条这样的记录啊,手工改要命啊。

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2013-01-18 22:06 |显示全部楼层
看晕了

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2013-01-18 22:36 |显示全部楼层
最后一行
ALTER TABLE BUL_DATA RENAME COLUMN PP_STATE TO STATE;
是根据什么规律转换来的?

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2013-01-21 17:02 |显示全部楼层
没有细看结果对不对,不知道你那个有没有笔误,反正结果是有一些不一样,你修修改改吧。
  1. [seesea@UC ~]$ awk -f sql.awk file.txt
  2. ALTER TABLE V3X_BBS_ARTICLE
  3. MODIFY CLICK_NUMBER  SMALLINT DEFAULT 0
  4. MODIFY ISSUE_TIME  DATETIME NOT NULL DEFAULT '2000-01-01 00:00:00'
  5. MODIFY ELITE_FLAG  SMALLINT
  6. MODIFY RESOURCE_FLAG  SMALLINT
  7. MODIFY ANONYMOUS_FLAG  SMALLINT
  8. MODIFY ANONYMOUS_REPLY_FLAG  SMALLINT
  9. MODIFY MESSAGE_NOTIFY_FLAG  SMALLINT
  10. MODIFY TOP_SEQUENCE  SMALLINT
  11. MODIFY PP_STATE  SMALLINT
  12. MODIFY REPLY_NUMBER  SMALLINT
  13. MODIFY MODIFY_TIME  DATETIME DEFAULT '2000-01-01 00:00:00';
  14. ALTER TABLE V3X_BBS_ARTICLE RENAME COLUMN PP_STATE TO STATE;
  15. ALTER TABLE V3X_BBS_ARTICLE RENAME TO BBS_ARTICLE;

  16. ALTER TABLE BUL_DATA
  17. MODIFY TITLE  VARCHAR(1024) NOT NULL
  18. MODIFY KEYWORDS  VARCHAR(500)
  19. MODIFY CREATE_DATE  DATETIME DEFAULT '2000-01-01 00:00:00' NOT NULL
  20. MODIFY AUDIT_DATE  DATETIME DEFAULT '2000-01-01 00:00:00'
  21. MODIFY PUBLISH_DATE  DATETIME DEFAULT '2000-01-01 00:00:00'
  22. MODIFY PIGEONHOLE_DATE  DATETIME DEFAULT '2000-01-01 00:00:00'
  23. MODIFY UPDATE_DATE  DATETIME DEFAULT '2000-01-01 00:00:00'
  24. MODIFY READ_COUNT  SMALLINT DEFAULT 0
  25. MODIFY TOP_ORDER  SMALLINT NOT NULL DEFAULT 0
  26. MODIFY PP_STATE  SMALLINT NOT NULL
  27. MODIFY DELETED_FLAG  SMALLINT NOT NULL DEFAULT 0
  28. MODIFY ATT_FLAG  SMALLINT;
  29. ALTER TABLE BUL_DATA RENAME COLUMN PP_STATE TO STATE;

  30. [seesea@UC ~]$ cat sql.awk
  31. {
  32.     sub(",", "")
  33. }

  34. $1 == "ALTER" {
  35.     sql_added = ""
  36.     sql_alter = $0
  37.     print $0
  38. }

  39. $1 == "RENAME" {
  40.     sql_rename_table = sql_alter" "$0";"
  41.     sql_added = sql_rename_table
  42. }

  43. $1 == "CHANGE" {
  44.     if ($2 != $3)
  45.     {
  46.         sql_rename_column = sql_alter" RENAME COLUMN "$2" TO "$3";"
  47.         sql_added = sql_rename_column"\n"sql_added
  48.     }

  49.     $1 = "MODIFY"
  50.     $3 = ""
  51.     #$0 = $0
  52.     print $0
  53. }

  54. $0 ~ ";" {
  55.     print sql_added
  56. }

  57. $0 == "" {
  58.     print
  59. }
  60. [seesea@UC ~]$
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2013-01-21 17:02 |显示全部楼层
btw,有没有高人告诉我如何处理删除一个域后有两个空格的问题,印象里好像是说 $0=$0 就可以去掉多余的分隔符,但我这里好像行不通,gawk 也不行,是版本问题?
  1. [seesea@UC ~]$ echo "a b c d" | gawk '{$2 = ""; $0=$0; print $0}'
  2. a  c d
  3. [seesea@UC ~]$ echo "a b c d" | awk '{$2 = ""; $0=$0; print $0}'
  4. a  c d
  5. [seesea@UC ~]$ awk --version
  6. GNU Awk 3.1.5
  7. Copyright (C) 1989, 1991-2005 Free Software Foundation.

  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.

  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.

  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  19. [seesea@UC ~]$ gawk --version
  20. GNU Awk 3.1.5
  21. Copyright (C) 1989, 1991-2005 Free Software Foundation.

  22. This program is free software; you can redistribute it and/or modify
  23. it under the terms of the GNU General Public License as published by
  24. the Free Software Foundation; either version 2 of the License, or
  25. (at your option) any later version.

  26. This program is distributed in the hope that it will be useful,
  27. but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29. GNU General Public License for more details.

  30. You should have received a copy of the GNU General Public License
  31. along with this program; if not, write to the Free Software
  32. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
复制代码

论坛徽章:
0
发表于 2013-01-23 08:17 |显示全部楼层
seesea2517 发表于 2013-01-21 17:02
btw,有没有高人告诉我如何处理删除一个域后有两个空格的问题,印象里好像是说 $0=$0 就可以去掉多余的分隔 ...


谢谢您,耐心的阅读,谢谢您能给出个awk程序,我将您的程序研究一下。

再次谢谢。

论坛徽章:
0
发表于 2013-01-23 08:20 |显示全部楼层
Shell_HAT 发表于 2013-01-18 22:36
最后一行
ALTER TABLE BUL_DATA RENAME COLUMN PP_STATE TO STATE;
是根据什么规律转换来的?


您好,是根据CHANGE PP_STATE STATE SMALLINT NOT NULL。 这句话,因第三列与第二列不同,需要改列的名字,但也有可能改列的类型,所以保留改列的类型,增加一个改列的名字,因ORACLE不能将 改名和该列类型 组合一条命令使用。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2013-01-23 09:38 |显示全部楼层
回复 5# seesea2517


    try:
  1. echo "a b c d" | gawk '{$2 = ""; $0=$0; $1=$1;print $0}'
复制代码

论坛徽章:
2
水瓶座
日期:2014-08-20 14:38:50辰龙
日期:2014-09-15 15:49:06
发表于 2013-01-23 09:55 |显示全部楼层
看的我有点晕啊

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2013-01-23 09:55 |显示全部楼层
回复 8# blackold


    啊啊啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP