免费注册 查看新帖 |

Chinaunix

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

[文本处理] grep得到的结果再处理 [复制链接]

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2015-04-20 19:34 |显示全部楼层
本帖最后由 prcardin 于 2015-04-30 10:01 编辑

grep得到的结果再处理
grep "dostr"  $dir/*.txt


action:dostr,m_uno:yx_hlld_93325534096,u_no:555523245,qd:yx.zhuanfa,plat:ANDROID,udno:d657c535-3avb-37bn-67ad-676689wer,server:10010,name_name:ither,ip:192.18.48.56
,dostr_time:2014-10-01 01:54:24,name_exp:0987015,mi:100,currency:CNY,amount:1000,dostr_channel:HGFG,dono:5476_001_57788563424_89471819952885,qd_dono:a54bnt


类似上面的数据,grep “dostr”获得的。现在想获得下面的数据,
2014-10-01 01:54:24        555523245        100        5476_001_57788563424_89471819952885        a54bnt
dostr_time                u_no                mi        dono                                        qd_dono
比如获取,qd_dono,grep -oP '(?<=qd_dono)\w+'.其他也可以这样获取。但是我想让他生成一行输出。请教下这怎么弄?awk数组还没找到思路

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
发表于 2015-04-20 21:07 |显示全部楼层
本帖最后由 zsszss0000 于 2015-04-20 21:10 编辑
  1. sed 'N;s/\n//g' file | awk -vRS="," -vFS=":" '{a[$1]=$2}END{for(i in a)print i,a[i]}'
复制代码
  1. name_name ither
  2. dostr_channel HGFG
  3. dostr_time 2014-10-01 01
  4. dono 5476_001_57788563424_89471819952885
  5. server 10010
  6. plat ANDROID
  7. u_no 555523245
  8. action dostr
  9. qd yx.zhuanfa
  10. mi 100
  11. currency CNY
  12. m_uno yx_hlld_93325534096
  13. qd_dono a54bnt

  14. name_exp 0987015
  15. amount 1000
  16. ip 192.18.48.56
  17. udno d657c535-3avb-37bn-67ad-676689wer
复制代码
可以修改END中的语句,改为printf a[dostr_time] a[u_no]

论坛徽章:
467
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2015-04-20 21:19 |显示全部楼层
本帖最后由 Herowinter 于 2015-04-20 21:26 编辑

回复 1# prcardin
  1. echo "action:dostr,m_uno:yx_hlld_93325534096,u_no:555523245,qd:yx.zhuanfa,plat:ANDROID,udno:d657c535-3avb-37bn-67ad-676689wer,server:10010,name_name:ither,ip:192.18.48.56,dostr_time:2014-10-01 01:54:24,name_exp:0987015,mi:100,currency:CNY,amount:1000,dostr_channel:HGFG,dono:5476_001_57788563424_89471819952885,qd_dono:a54bnt"|awk -F, 'BEGIN{head="dostr_time\tu_no\tmi\tdono\tqd_dono";l=split(head,a,"\t");for(i=1;i<=l;i++)b[a[i]]} {for(i=1;i<=NF;i++){k=gensub(/([^:]*):(.*)/,"\\1",1,$i);v=gensub(/([^:]*):(.*)/,"\\2",1,$i);if(k in b)b[k]=v};for(i=1;i<=l;i++)s=length(s)?s"\t"b[a[i]]:b[a[i]];print s;print head}'
  2. 2014-10-01 01:54:24     555523245       100     5476_001_57788563424_89471819952885     a54bnt
  3. dostr_time      u_no    mi      dono    qd_dono
复制代码
把echo改成你的grep命令.
   

论坛徽章:
467
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2015-04-20 21:27 |显示全部楼层
回复 2# zsszss0000

VS=":"处理会有点问题  那个时间格式里带":"的, 一开始我这里也错了.
   

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-04-20 22:47 |显示全部楼层
本帖最后由 jason680 于 2015-04-20 22:52 编辑

回复 1# prcardin

$ awk -F, '/dostr/{for(n=1;n<=NF;n++){p=index($n,":");a[substr($n,1,p-1)]=substr($n,p+1)}}END{print a["dostr_time"],a["u_no"],a["mi"],a["dono"],a["qd_dono"]}' file
2014-10-01 01:54:24 555523245 100 5476_001_57788563424_89471819952885 a54bnt

   

论坛徽章:
467
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2015-04-20 23:06 |显示全部楼层
回复 5# jason680

这个index用得很好啊,向大神学习了。
   

论坛徽章:
0
发表于 2015-04-20 23:37 |显示全部楼层
perl -lane '@tmp_list1=split/,/,$_;foreach $tmp_val (@tmp_list1){@tmp_list2=split/:/,$tmp_val;$t_hash{$tmp_list2[0]}=$tmp_list2[1];}print "$t_hash{dostr_time}\t$t_hash{u_no}\t$t_hash{mi}\t$t_hash{dono}\t$t_hash{qd_dono}"'  file

file就是你grep出来的东西

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2015-04-21 09:51 |显示全部楼层
谢谢680.输出数据和格式是可以的。但是源数据很多条,出来却只有一条的~  
awk ‘/dostr/’  会有很多条,最后输出的数据也应该是很多条,只出来了一条数据
回复 5# jason680


   

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2015-04-21 09:53 |显示全部楼层
谢谢指教,在时间输出那块只得到了 2014-10-01 20,分钟和秒没有得到。其他4块输出是对的。
回复 7# 程序猿zy


   

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2015-04-21 10:02 |显示全部楼层
谢谢,多行数据后输出在一行了,后面加了个xargs -n6得到了想要的数据了
回复 3# Herowinter


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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP