免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求shell按列排序去重代码 [复制链接]

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
11 [报告]
发表于 2018-03-23 18:58 |只看该作者
本帖最后由 wh7211 于 2018-03-24 14:36 编辑

回复 10# zbs168


<<< awk4.0+
  1. 方法1:无中间文件,直接满足所有需求
  2. awk '$0!~/^$/{a[$14]=$1;b[$14]=$2;c[$14]=$3;d[$14]=$9;e[$14]=$18;f[$14]=$19}END{for(x in c){g=systime();h=strftime("%Y",g);split(c[x],i,":");a[x]=a[x]=="Jan"?1:a[x]=="Feb"?2:a[x]=="Mar"?3:a[x]=="Apr"?4:a[x]=="May"?5:a[x]=="Jun"?6:a[x]=="Jul"?7:a[x]=="Aug"?8:a[x]=="Sep"?9:a[x]=="Oct"?10:a[x]=="Nov"?11:a[x]=="Dec"?12:"";j=mktime(""h" "a[x]" "b[x]" "i[1]" "i[2]" "i[3]"");e[x]=e[x]=="valid"?j+f[x]:e[x];if(e[x]>=g||e[x]=="bad"){k[x]="("j") "d[x]" "x" "e[x]}};PROCINFO["sorted_in"]="@val_num_asc";for(y in k){print k[y]>"a.txt"}}' 1

  3. 方法2:生成中间文件并二次过滤
  4. 生成中间文件“a.txt”:
  5. awk '$0!~/^$/{a[$14]=$1;b[$14]=$2;c[$14]=$3;d[$14]=$9;e[$14]=$18;f[$14]=$19}END{for(x in c){split(c[x],g,":");h=strftime("%Y",systime());a[x]=a[x]=="Jan"?1:a[x]=="Feb"?2:a[x]=="Mar"?3:a[x]=="Apr"?4:a[x]=="May"?5:a[x]=="Jun"?6:a[x]=="Jul"?7:a[x]=="Aug"?8:a[x]=="Sep"?9:a[x]=="Oct"?10:a[x]=="Nov"?11:a[x]=="Dec"?12:"";i=mktime(""h" "a[x]" "b[x]" "g[1]" "g[2]" "g[3]"");e[x]=e[x]=="valid"?i+f[x]:e[x];j[x]="("i") "d[x]" "x" "e[x]};PROCINFO["sorted_in"]="@val_num_asc";for(y in j){print j[y]>"a.txt"}}' 1

  6. 对中间文件“a.txt”进行二次过滤并生成最终文件“b.txt”:
  7. awk '{a=systime()}$4!="bad"&&$4>=a||$4=="bad"{print>"b.txt"}' a.txt
复制代码






论坛徽章:
0
12 [报告]
发表于 2018-03-24 20:11 |只看该作者
回复 11# wh7211

能否私信给个qq一类的,我把文件给您发过去,麻烦您给看看,好像还是不行

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
13 [报告]
发表于 2018-03-25 13:49 |只看该作者
可以,你把qq私信发我吧

论坛徽章:
0
14 [报告]
发表于 2018-03-25 16:53 |只看该作者
回复 13# wh7211

55555555555555555,这就是最悲催的事情,我的用户组发不了私信。。。。

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
15 [报告]
发表于 2018-03-26 14:45 |只看该作者
已经发给你了

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
16 [报告]
发表于 2018-03-26 16:35 |只看该作者
本帖最后由 wh7211 于 2018-03-26 17:19 编辑

回复 14# zbs168


脚本处理过程:脚本运行,清空b.txt,将原有a.txt复制到b.txt,针对abc.log执行代码,生成数据追加到b.txt,然后对b.txt二次处理生成最终的a.txt,清空abc.log
5分钟以后,abc.log中又有新的数据了
脚本运行,清空b.txt,将原有a.txt复制到b.txt,针对abc.log执行代码,生成数据追加到b.txt,然后对b.txt二次处理生成最终的a.txt,清空abc.log
循环执行。。。

<<<awk4.0+
  1. 生成中间文件“b.txt”,每次执行代码都会追加到中间文件中:
  2. 需求描述:
  3. 1.首先根据mac地址和时间排序去重,即相同mac地址不同时间的日志,只留下最后一个时间的
  4. 2.对前面3列自动补充本年的年份后转为unix时间戳
  5. 3.对最后面的状态位如果是bad的,输出bad,如果是valid的,只输出ms数(已改成输出“第1列时间戳+ms”)
  6. 4.最后按照时间的unix时间戳进行升序排列

  7. awk '$0!~/^$/{a[$14]=$1;b[$14]=$2;c[$14]=$3;d[$14]=$9;e[$14]=$18;f[$14]=$19}END{for(x in c){split(c[x],g,":");h=strftime("%Y",systime());a[x]=a[x]=="Jan"?1:a[x]=="Feb"?2:a[x]=="Mar"?3:a[x]=="Apr"?4:a[x]=="May"?5:a[x]=="Jun"?6:a[x]=="Jul"?7:a[x]=="Aug"?8:a[x]=="Sep"?9:a[x]=="Oct"?10:a[x]=="Nov"?11:a[x]=="Dec"?12:"";i=mktime(""h" "a[x]" "b[x]" "g[1]" "g[2]" "g[3]"");e[x]=e[x]=="valid"?"valid "i+f[x]:e[x];j[x]=i" "d[x]" "x" "e[x]};PROCINFO["sorted_in"]="@val_num_asc";for(y in j){print j[y]>>"b.txt"}}' 1

  8. 对中间文件“b.txt”进行二次处理并生成最终文件“a.txt”:
  9. 需求描述:
  10. 1.根据mac进行排序,相同mac重复的数据只保留日期最近的一条数据,不同mac无重复的数据保留
  11. 2.获取当前的unix时间戳
  12. 3.将最后一列的数值与第2步得到的unix时间戳对比,如果小于当前unix时间戳,就抛弃该行,表示过期
  13. 4.最后还是按照第一列进行升序排列

  14. awk '{a=systime()}{b[$3]=$4;c[$3]=$5;d[$3]=$0}END{for(i in d){if(b[i]=="valid"&&c[i]>=a||b[i]=="bad"){print d[i]>"a.txt"}}}' b.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP