免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3134 | 回复: 14
打印 上一主题 下一主题

[文本处理] awk 文件处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-17 22:41 |只看该作者 |倒序浏览
a.file 内容如下:

TX_ID       EOSE_NUM   SEN      ARRIVAL_TS                     TX_TYPE  TX_SUBTYPE STATUS SUCCESS_TYPE                  
----------- ---------- -------- ------------------------------ -------- ---------- ------ ------------------------------
   10234959 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   U      2011-12-09-12.02.07.520000   
   10234960 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   U      2011-12-09-12.02.07.520000   
   10234961 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   S      2011-12-09-12.02.07.520000   
   10234962 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   U      2011-12-09-12.02.07.520000   
   10234963 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   S      2011-12-09-12.02.07.520000   
   10234964 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   D      2011-12-09-12.02.07.520000   
   10234965 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   F      2011-12-09-12.02.07.520000   
   10234965 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   S      2011-12-09-12.02.07.520000   

  8 record(s) selected.

需要用 awk 做如下处理:

if ((status = 'U' || status = 'S') && (tx_subtype= 'EOSE-GEN')) || ((status = 'S') && (tx_subtype= 'ORD-SHIP'))
    then: do nothing
Else:
     print the whole line
END

这是一个数据库输出的内容,status 字段对应的内容如果是 'U' 或者's' 而且 tx_subtype 内容 是 EOSE-GEN
                                    或者status 字段对应的内容如果是 's' 而且 tx_subtype 内容 是 ORD-SHIP
   就不输出这一行

否则
      输出整行内容。

本人对 awk 不是很熟悉,正在寻找方法处理,可能比较麻烦一些,寻求帮助,谢谢。



论坛徽章:
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
2 [报告]
发表于 2014-03-17 23:35 |只看该作者
回复 1# littleboys


    其实就是语法问题吧:
  1. awk '{if (($7== "U" || $7== "S") && ($6== "EOSE-GEN")) || (($7== "S") && ($6== "ORD-SHIP")) {next;} else {print;}; }' a.file
复制代码
未测试。

论坛徽章:
0
3 [报告]
发表于 2014-03-17 23:46 |只看该作者
我也写了一个方法

我也写了一个shell 脚本
#!/bin/awk -f
{
    if((($7=="U" || $7=="S") && ($6=="EOSE-GEN")) || (($7=="S") && ($6=="ORD-SHIP"))){
        # do nothing
    }else{
        printf $0"\r\n"
    }
}

测试通过了,正在测试特例, 谢谢楼上

论坛徽章:
0
4 [报告]
发表于 2014-03-18 00:00 |只看该作者
如果 a.file 内容里面的字段的数据是空值的时候,处理有些问题


TX_ID       EOSE_NUM   SEN      ARRIVAL_TS                     TX_TYPE  TX_SUBTYPE STATUS SUCCESS_TYPE                  
----------- ---------- -------- ------------------------------ -------- ---------- ------ ------------------------------
   10234959 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   U      2011-12-09-12.02.07.520000   
   10234960 Q89212     34GL     2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   U      2011-12-09-12.02.07.520000   
   10234961 Q89212              2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   S      2011-12-09-12.02.07.520000   
   10234962 Q89212              2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   U      2011-12-09-12.02.07.520000   
   10234963 Q89212              2011-12-09-12.02.07.520000     EOSE     ORD-SHIP   S      2011-12-09-12.02.07.520000   
   10234964 Q89212              2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   D      2011-12-09-12.02.07.520000   
   10234965 Q89212              2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   F      2011-12-09-12.02.07.520000   
   10234965 Q89212     -        2011-12-09-12.02.07.520000     EOSE     EOSE-GEN   S      -                             

  8 record(s) selected.

例子中SEN 字段的值是空值的时候, $6 和 $7 不是所要的字段

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2014-03-18 00:00 |只看该作者
回复 3# littleboys

没必要用那么多小括号
  1. awk '{if($7~/^[US]$/&&$6=="EOSE-GEN"||$7=="S"&&$6=="ORD-SHIP")next;else print}'
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-03-18 00:02 |只看该作者
回复 4# littleboys

如果最后一个字段一定不为空的话,可以用$(NF-1)代替$7,用$(NF-2)代替$6
   

论坛徽章:
0
7 [报告]
发表于 2014-03-18 00:18 |只看该作者
回复 6# yestreenstars

这个应该没有问题了,谢谢~~


   

论坛徽章:
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
8 [报告]
发表于 2014-03-18 08:30 |只看该作者
我很好奇, 为啥不在数据库里直接完成这个工作? 非要拿出来再搞一次? 为了兴趣么?

论坛徽章:
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
9 [报告]
发表于 2014-03-18 09:48 |只看该作者
回复 4# littleboys


    嗯,有字段为空是个特例。如果你的分隔符是一个TAB的话,直接设置awk的 FS 就可以了。不知道是不是因为你粘贴复制的原因在描述里是空格,不过看上去格式是整齐的,如果是这样也可以通过设置awk的域宽来达到效果。当然啦,现在已经解决了就好了。

论坛徽章:
0
10 [报告]
发表于 2014-03-18 13:33 |只看该作者
回复 9# seesea2517
awk的域宽 还真不知道是多少,也需要计算 ----- 的长度才能知道,有时间学习一下。



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP