免费注册 查看新帖 |

Chinaunix

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

[文本处理] 按需填空,没有时输出“none”,特请帮忙。 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-01 18:47 |显示全部楼层
本帖最后由 volwang 于 2015-05-01 18:58 编辑

chinaninxers,下面一行(只有1行)请帮小弟处理一下:
12/25/2013 14:16:01;E;1008.mgmt1;user=spbadmin group=Domain Users project=_pbs_project_default jobname=test456 queue=workq ctime=1387952152 qtime=1387952152 etime=1387952152 start=1387952155 exec_host=a111/0*20 exec_vnode=(a111:ncpus=20) Resource_List.fluent=20 Resource_List.mpiprocs=20 Resource_List.ncpus=20 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=20:mpiprocs=20:pas_applications_enabled=Fluent-mpp:platform=XeonE5-20c-80G Resource_List.software=Fluent Resource_List.useplatform=XeonE5-20c-80G session=11032 end=1387952161 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:04 resources_used.mem=146056kb resources_used.ncpus=20 resources_used.vmem=3859500kb resources_used.walltime=00:00:03 run_count=1

希望输出如下10个关键字信息:(第一行为关键字)
job        user              group      jobname      queue        ctime                  start                     end         Resource_List.ncpus      xxxx        
1008.mgmt1   spbadmin   Domain       test456      workq   1387952152      1387952155           1387952161     20                           none

说明一下:
关键字后面肯定出现“=”符号,第一个关键字为job例外。
当没有的关键字选项时,输出“none”,例如输出“xxxx”选项,应为文本中没有这个"xxxx=",输出none
1387952152 /1387952155/1387952161  为秒,请帮忙修改为“年/月/日/小时:分钟:秒”

类似于根据关键字填空。多谢。祝节日快乐。


文本的特点是以空格分开后,是一个个字段。除了第一个"12/25/2013“ 和第二个 "14:16:01;E;1008.mgmt1;user=spbadmin”之外,后面的多是关键字=某某某,有些“关键字= ”的信息不是我想要的。
   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-01 18:59 |显示全部楼层
本帖最后由 volwang 于 2015-05-01 19:09 编辑

这里只是列出了一行,后面还有很多类似的行,请各位帮忙有什么好方法。能输出我想要的关键字内容。
有没有好方法快速匹配。
坐等大神啊

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2015-05-01 20:47 |显示全部楼层
  1. #!/bin/bash

  2. awk -vRS=";" 'BEGIN{
  3.         title = "job        user              group      jobname      queue        ctime                  start                     end         Resource_List.ncpus      xxxx"
  4.         len = split(title, title_array, " ");
  5.         for(i=1; i<=len; i++)
  6.                 if(i >= 6 && i <= 9)
  7.                         printf("%-20s", title_array[i]);
  8.                 else
  9.                         printf("%-10s", title_array[i]);

  10.         print "";
  11. }NR==3{
  12.         printf("%-10s", $0)
  13. }NR>3{
  14.         for(i=1; i<=NF; i++) {
  15.                 split($i, pair, "=")
  16.                 keys[pair[1]] = pair[2]
  17.         }

  18.         for(t=2; t<=len; t++) {
  19.                 if(title_array[t] in keys) {
  20.                         #print title_array[t]
  21.                         if(t >= 6 && t <= 8) {
  22.                                 cmd = "date -d @"keys[title_array[t]]" +%Y/%m/%d/%H:%M:%S"
  23.                                 cmd | getline date
  24.                                 sub("\n", "", date)
  25.                                 keys[title_array[t]] = date
  26.                         }
  27.                         if(t >= 6 && t <= 9)
  28.                                 printf("%-20s", keys[title_array[t]])
  29.                         else
  30.                                 printf("%-10s", keys[title_array[t]])
  31.                 }
  32.                 else
  33.                         printf("%-10s", "none");
  34.         }

  35.         print "";

  36. }' testfile
复制代码
回复 1# volwang
  1. -HP-ProBook-4416s:~/bash$ ./myscript.sh
  2. job       user      group     jobname   queue     ctime               start               end                 Resource_List.ncpus xxxx      
  3. 1008.mgmt1spbadmin  Domain    test456   workq     2013/12/25/14:15:52 2013/12/25/14:15:55 2013/12/25/14:16:01 20                  none
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-01 21:59 |显示全部楼层
回复 3# liion631818


  谢谢支持。我还在看,学习。 如果有很多行类似的,需要依次读取,输出呢?

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2015-05-01 22:09 |显示全部楼层
回复 4# volwang


    你试试..... 不行就贴出完整的数据

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-01 22:44 |显示全部楼层
本帖最后由 volwang 于 2015-05-01 22:54 编辑

回复 5# liion631818


12/25/2013 14:16:01;E;1008.mgmt1;user=spbadmin group=Domain Users project=_pbs_project_default jobname=test456 queue=workq ctime=1387952152 qtime=1387952152 etime=1387952152 start=1387952155 exec_host=a111/0*20 exec_vnode=(a111:ncpus=20) Resource_List.fluent=20 Resource_List.mpiprocs=20 Resource_List.ncpus=20 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=20:mpiprocs=20:pas_applications_enabled=Fluent-mpp platform=XeonE5-20c-80G Resource_List.software=Fluent Resource_List.useplatform=XeonE5-20c-80G session=11032 end=1387952161 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:04 resources_used.mem=146056kb resources_used.ncpus=20 resources_used.vmem=3859500kb resources_used.walltime=00:00:03 run_count=1

12/25/2013 14:16:01;E;1009.mgmt1;user=admin group=Domain Users project=_pbs_project_default jobname=test567 queue=workq ctime=1387952152 qtime=1387952152 etime=1387952152 start=1387952155 exec_host=a111/0*20 exec_vnode=(a111:ncpus=20) Resource_List.fluent=20 Resource_List.mpiprocs=20 Resource_List.ncpus=20 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=20:mpiprocs=20:pas_applications_enabled=Fluent-mpp platform=XeonE5-20c-80G Resource_List.software=Fluent Resource_List.useplatform=XeonE5-20c-80G session=11032 end=1387952161 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:04 resources_used.mem=146056kb resources_used.ncpus=20 resources_used.vmem=3859500kb resources_used.walltime=00:00:03 run_count=1

12/25/2013 14:16:01;E;1010.mgmt1;user=admin group=Domain Users project=_pbs_project_default jobname=test789 queue=workq ctime=1387952152 qtime=1387952152 etime=1387952152 start=1387952155 exec_host=a111/0*20 exec_vnode=(a111:ncpus=20) Resource_List.fluent=20 Resource_List.mpiprocs=20 Resource_List.ncpus=40 Resource_List.nodect=1 Resource_List.place=free Resource_List.select=1:ncpus=20:mpiprocs=20:pas_applications_enabled=Fluent-mpp platform=XeonE5-20c-80G Resource_List.software=CFX Resource_List.useplatform=XeonE5-20c-80G session=11032 end=1387952161 Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:04 resources_used.mem=146056kb resources_used.ncpus=20 resources_used.vmem=3859500kb resources_used.walltime=00:00:03 run_count=1


输出:
job   user     group      jobname      queue        ctime    start      end    Resource_List.software  Resource_List.ncpus    platform      xxxx        
1008.mgmt1   spbadmin  Domain   test456      workq   1387952152      1387952155           1387952161   Fluent  20   XeonE5-20c-80G               none
1009.mgmt1   admin   Domain       test567      workq   1387952152      1387952155           1387952161   Fluent   20   XeonE5-20c-80G              none
1010.mgmt1   admin   Domain      test789      workq   1387952152      1387952155           1387952161    CFX   40       none            none



   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-01 23:02 来自手机 |显示全部楼层
本帖最后由 volwang 于 2015-05-01 23:03 编辑

我稍微变化了一下,很多行类似的。
我需要的关键字选项的值输按格式输出来。如果这行不存在这个关键字,则默认等于none。

谢谢。

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-05-01 23:17 |显示全部楼层
回复 1# volwang
  1. awk -F'[ ;=]+' 'BEGIN{
  2.     a["job"]=a["user"]=a["group"]=a["jobname"]=a["queue"]=a["ctime"]=a["start"]=a["end"]=a["Resource_List.ncpus"]="";
  3.     b[1]="job";b[2]="user";b[3]="group";b[4]="jobname";b[5]="queue";b[6]="ctime";b[7]="start";b[8]="end";b[9]="Resource_List.ncpus";
  4.     print "job\tuser\tgroup\tjobname\tqueue\tctime\tstart\tend\tResource_List.ncpus";
  5. }
  6. {
  7.     s=$4;
  8.     for(i=5;i<=NF;i++)
  9.     {
  10.         if($i in a)
  11.         {
  12.             a[$i]=$(i+1);
  13.         }
  14.     }
  15.     for(k=2;k<=length(b);k++)
  16.     {
  17.         if((k==6||k==7||k==8)&&length(a[b[k]])!=0)
  18.         {
  19.             a[b[k]]=strftime("%Y/%m/%d/%T",a[b[k]]);
  20.         }
  21.         s=length(a[b[k]])?s"\t"a[b[k]]:s"\tnone";
  22.         a[b[k]]="";
  23.     }
  24.     print s;
  25.     s=""
  26. }
  27. ' file | column -t
  28. job         user      group   jobname  queue  ctime                start                end                  Resource_List.ncpus
  29. 1008.mgmt1  spbadmin  Domain  test456  workq  2013/12/25/14:15:52  2013/12/25/14:15:55  2013/12/25/14:16:01  20
  30. 1008.mgmt1  spbadmin  Domain  test456  none   2013/12/25/14:15:52  2013/12/25/14:15:55  2013/12/25/14:16:01  20
  31. 1008.mgmt1  spbadmin  Domain  test456  workq  none                 2013/12/25/14:15:55  2013/12/25/14:16:01  20
复制代码
拿你给数据复制了两行,删掉其中queue和ctime的选项,是否是你要的结果?

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-05-01 23:59 |显示全部楼层
回复 1# volwang
  1. awk -F'[ ;=]+' 'BEGIN{
  2.     t="job\tuser\tgroup\tjobname\tqueue\tctime\tstart\tend\tResource_List.ncpus";
  3.     for(i=1;i++<=split(t,b,"\t");)a[b[i]]=""
  4.     print t;
  5. }
  6. {
  7.     s=$4;
  8.     for(i=5;i<=NF;i++)if($i in a)a[$i]=$(i+1);
  9.     for(k=2;k<=length(b);k++)
  10.     {
  11.         if((k==6||k==7||k==8)&&length(a[b[k]])!=0)
  12.         {
  13.             a[b[k]]=strftime("%Y/%m/%d/%T",a[b[k]]);
  14.         }
  15.         s=length(a[b[k]])?s"\t"a[b[k]]:s"\tnone";
  16.         a[b[k]]="";
  17.     }
  18.     print s;s="";
  19. }' file | column -t
复制代码
优化了一下,结果一样

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-02 07:32 |显示全部楼层
本帖最后由 volwang 于 2015-05-02 07:36 编辑

回复 9# songyc_2015


厉害了,非常之感谢 是我需要的结果。
是不是可以这样理解,如果需要扩充匹配关键字并输出,只需要在如下行中加入关键字名称即可,对吧?
t="job\tuser\tgroup\tjobname\tqueue\tctime\tstart\tend\tResource_List.ncpus";
我还有一个需求,在输出的列中,在增加两列,这两列需要对几个时间做处理,两列是:
run_time=end-start
pend_time=ctime-start
单位小时,至少保留3位有效数字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP