忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 893 | 回复: 12

[文本处理] 这个要命的要求能不能用shell实现 [复制链接]

论坛徽章:
0
发表于 2017-07-08 10:35 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:08 编辑

有两个表,第一个(table1)是fields 命字,第二个(table2) 是规则:根据表1中rulekey 的顺序,用表1中的COL name 在表2中每行的值,写出CASE statement.
表一中的D表示这个col没有值。例如:rule 0: 是所有的col都有值; rule1 是col3和col7没有值;rule2 是col4, col6 和col7 没有值。。。
下面的这个写出来就是:
case when COL1 = 'V' AND COL2 = 'B' AND COL3 = 'C' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0 AND SEC_TYP = 1 THEN 869 (rule0)
WHEN COL1 = 'V' AND COL2 = 'B' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0  THEN 999 (rule 1)
WHEN COL1 = 'V' AND COL2 = 'I' AND  P_CODE = 0 AND M_FEC = 0 THEN 873 (rule 2)
END

RULEKEY SRC1 SRC2 SRC3 SRC4 SRC5 SRC6 SRC7
0 COL1      COL2  COL3 P_CODE M_SRC M_FEC SEC_TYP
1 COL1 COL2 D P_CODE M_SRC M_FEC D
2 COL1 COL2 COL3 D M_SRC D D
3 COL1 COL2 D D M_SRC M_FEC SEC_TYP
4 COL1 COL2 D D M_SRC D SEC_TYP


COL1  COL2 COL3 P_CODE M_SRC M_FEC SEC_TYPRESULT
V B C 0 5 0 1 869
V B 0 6 0 999
V I 0 0 873

B 0 5 0 1233


谢谢各位

论坛徽章:
38
辰龙
日期:2013-08-21 15:45:19寅虎
日期:2014-06-09 12:52:17双鱼座
日期:2014-06-10 12:42:44巨蟹座
日期:2014-06-12 23:17:17戌狗
日期:2014-06-17 09:53:29未羊
日期:2014-10-10 13:45:41申猴
日期:2015-03-03 17:21:37亥猪
日期:2015-03-03 17:22:002015亚冠之广州富力
日期:2015-05-12 16:34:522015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:08平安夜徽章
日期:2015-12-26 00:06:30
发表于 2017-07-08 12:56 |显示全部楼层
case when COL1 = 'V' AND COL2 = 'B' AND COL3 = 'C' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0 AND SEC_TYP = 1 THEN 869
WHEN COL1 = 'V' AND COL2 = 'B' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0  THEN 999
WHEN COL1 = 'V' AND COL2 = 'I' AND  P_CODE = 0 AND M_FEC = 0 THEN 873
WHEN COL1 = 'F' AND COL2 = 'B' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0 THEN 1233
END
上面这段是不是rule 0: 要的结果?

那rule 1  rule 2  rule 3 对应的结果是怎么样的呢?

论坛徽章:
302
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-08 13:06 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-07-08 13:22 编辑

perl abc.pl a b






#!/usr/bin/perl
use strict;
use warnings;

sub Load{
    local @ARGV = pop;
    my $fb = [];
    while(<>){
        my @aT = split;
        /\A\s*[a-z]/i ? push(@{$fb}, [@aT]) : push(@{$fb->[-1]}, @aT ? @aT : undef);
    }
    $fb;
}

my $fb = Load(pop);
my ($pos, $fa) = (-1, []);

print("case ");
<>;
my @aFix = ('COL1',  'COL2',  'COL3',  'P_CODE',  'M_SRC',  'M_FEC',  'SEC_TYP');
local $" = " AND ";
while(<>){
    if(/\A(\d+)\Z/){
        $pos = $1;
        next;
    }
    next if(!defined($fb->[$pos]));
    print("when ");
    my @aT = split;
    my @aOut = ();
    foreach(0 .. $#aT - 1){
        next if(!defined($fb->[$pos][$_]));
        my $v = $fb->[$pos][$_];
        my $pair = $aT[$_] eq 'D' ? [$aFix[$_], 0] : [$aFix[$_], $v =~ /\D/ ? "'$v'" : $v];
        push(@aOut, sprintf("%s = %s", @$pair));
    }
    print("@aOut THEN $fb->[$pos][-1]\n");
}
print("END\n");



论坛徽章:
0
发表于 2017-07-08 13:06 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:09 编辑

回复 2# 关阴月飞

刚刚有一个不对,修改了一下把rule写到后面了,请不要考虑表2的最后一行

论坛徽章:
0
发表于 2017-07-08 13:12 |显示全部楼层
回复 3# sunzhiguolu

谢谢你这么快给出答案了,可惜不会perl,能不能给个shell脚本

论坛徽章:
0
发表于 2017-07-08 13:23 |显示全部楼层
回复 2# 关阴月飞

刚刚又看了一下要求,其实不用表1就可以,有什么办法用表2第一行的列名,和每一行组合,有值就用,没有值就不用. 上面表二得到如下结果
case when COL1 = 'V' AND COL2 = 'B' AND COL3 = 'C' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0 AND SEC_TYP = 1 THEN 869
WHEN COL1 = 'V' AND COL2 = 'B' AND P_CODE = 0 AND M_SRC = 5 AND M_FEC = 0  THEN 999
WHEN COL1 = 'V' AND COL2 = 'I' AND  P_CODE = 0 AND M_FEC = 0 THEN 873
When col2='B' and p_code = 0 and m_scr = 5 and m_fec = 0 then 1233
END



论坛徽章:
0
发表于 2017-07-08 13:23 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:34 编辑

发重了、对不起

论坛徽章:
0
发表于 2017-07-08 13:24 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:33 编辑

发送报错,发重了

论坛徽章:
0
发表于 2017-07-08 13:25 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:32 编辑

麻烦版主把重复的刪了吧,实在不好意思

论坛徽章:
0
发表于 2017-07-08 13:27 |显示全部楼层
本帖最后由 KEN6503 于 2017-07-08 13:29 编辑

实在不好意思,刚才发送一直报错,没想到重复了这么多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票6.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP