免费注册 查看新帖 |

Chinaunix

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

[文本处理] AWK请问如何输出后一行减前一行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-25 21:46 |只看该作者 |倒序浏览
一个文本,aaa.txt 内容如下(有N行,4列,第二列到第四列为16进制的数)第一列是时间分钟:秒.毫秒,第二列到第四列是经纬度:

30:42.414        55c8fb7d  3f795cae  11a5c63c
30:42.418        55c8fb7f   3f795efc   11a5c63c
30:42.426        55c8fb82  3f796168  11a5c664
30:57.455        55c8fb85  3f7963f2  11a5c66e
30:57.459        55c8fb89  3f7966fe  11a5c664
31:21.786        55c8fbc8  3f796a50  11a5c5a6
31:24.900        55c8fbcb  3f796d02  11a5c6e6
31:24.904        55c8fbce  3f79713a  11a5cc36
32:04.747        55c8fbd1  3f797270 11a5d456
         ......
        .....
       .....



下边想进行如下操作:用第二行的数减去第一行的数所得结果显示在第二行后面,然后用第三行的数减去第二行的数输所得果显示在第三行后面;
就是下一行减去上一行所得结果显示在下一行后面;如下所示:
30:42.414        55c8fb7d  3f795cae  11a5c63c   
30:42.418        55c8fb7f   3f795efc   11a5c63c    00:00.004  00000002   0000024e  00000000
30:42.426        55c8fb82  3f796168  11a5c664   00:00.008  00000003   0000026c   00000028
30:57.455        55c8fb85  3f7963f2  11a5c66e    00:15.029  00000003   0000028a   0000000a
30:57.459        55c8fb89  3f7966fe  11a5c664                                    ......
31:21.786        55c8fbc8  3f796a50  11a5c5a6                                    ......
31:24.900        55c8fbcb  3f796d02  11a5c6e6                                   ......
31:24.904        55c8fbce  3f79713a  11a5cc36                                    .....
32:04.747        55c8fbd1  3f797270 11a5d456                                   ......
         ......                                                                                ......
        .....                                                                                  .....
       .....

麻烦了,求各位大神指导,谢谢!!!

论坛徽章:
0
2 [报告]
发表于 2015-08-25 22:56 |只看该作者
求助如何做!!!!输出到另一个TXT文件里

论坛徽章:
0
3 [报告]
发表于 2015-08-26 10:25 |只看该作者
输出格式这样也行的,有没有大神能帮忙下的,急求!!!
30:42.414        55c8fb7d  3f795cae  11a5c63c   
30:42.418        55c8fb7f   3f795efc   11a5c63c    4            2   24e  0
30:42.426        55c8fb82  3f796168  11a5c664   8            3   26c   28
30:57.455        55c8fb85  3f7963f2  11a5c66e    15.029   3   28a   a
30:57.459        55c8fb89  3f7966fe  11a5c664                     ..
31:21.786        55c8fbc8  3f796a50  11a5c5a6                       ..
31:24.900        55c8fbcb  3f796d02  11a5c6e6                       ..
31:24.904        55c8fbce  3f79713a  11a5cc36                       ..
32:04.747        55c8fbd1  3f797270 11a5d456                      ..
         ......                                                                                ..
        .....                                                                                  .

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-08-26 11:40 |只看该作者
凡是不自己试图解决的问题, 都不是多着急的问题.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2015-08-26 11:40 |只看该作者
凡是不自己试图解决的问题, 都不是多着急的问题.

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
6 [报告]
发表于 2015-08-26 11:45 |只看该作者
本帖最后由 关阴月飞 于 2015-08-26 13:05 编辑

回复 3# xinxue123456


    这里主要算时间麻烦,要转化成ms 然后相减,再转化回来

1.时间运算: 将时间转化成ms, 然后相减,再转化回原来的格式
  1. awk 'BEGIN{split("1:1000:60000",a,":")}NR>1{n=split($1,b,":|\\.");for(i=n;i;i--)d+=b[i]*a[n-i+1];print $0,int((d-c)/60000)":"int((d-c)%60000/1000)"."int((d-c)%60000%1000;c=d=0}{n=split($1,b,":|\\.");for(i=n;i;i--)c+=b[i]*a[n-i+1]}NR==1' urfile
  2. 30:42.414  55c8fb7d  3f795cae  11a5c63c
  3. 30:42.418  55c8fb7f  3f795efc  11a5c63c  0:0.4
  4. 30:42.426  55c8fb82  3f796168  11a5c664  0:0.8
  5. 30:57.455  55c8fb85  3f7963f2  11a5c66e  0:15.29
  6. 30:57.459  55c8fb89  3f7966fe  11a5c664  0:0.4
  7. 31:21.786  55c8fbc8  3f796a50  11a5c5a6  0:24.327
  8. 31:24.900  55c8fbcb  3f796d02  11a5c6e6  0:3.114
  9. 31:24.904  55c8fbce  3f79713a  11a5cc36  0:0.4
  10. 32:04.747  55c8fbd1  3f797270  11a5d456  0:39.843
复制代码
2.经纬度运算: 将需要运算的16进制数统一加上 0x 前缀,使用 awk --non-decimal-data 选项后便可直接相减,得到差值后,再使用printf 进行格式化
  1. awk --non-decimal-data 'NR>1{printf $0" ";for(i=2;i<=NF;i++){b[i]="0x"$i;printf "%08X ",b[i]-a[i]};print c}{for(i=2;i<=NF;i++)a[i]="0x"$i}NR==1' urfile
  2. 30:42.414        55c8fb7d  3f795cae  11a5c63c
  3. 30:42.418        55c8fb7f   3f795efc   11a5c63c 00000002 0000024E 00000000
  4. 30:42.426        55c8fb82  3f796168  11a5c664 00000003 0000026C 00000028
  5. 30:57.455        55c8fb85  3f7963f2  11a5c66e 00000003 0000028A 0000000A
  6. 30:57.459        55c8fb89  3f7966fe  11a5c664 00000004 0000030C FFFFFFFFFFFFFFF6
  7. 31:21.786        55c8fbc8  3f796a50  11a5c5a6 0000003F 00000352 FFFFFFFFFFFFFF42
  8. 31:24.900        55c8fbcb  3f796d02  11a5c6e6 00000003 000002B2 00000140
  9. 31:24.904        55c8fbce  3f79713a  11a5cc36 00000003 00000438 00000550
  10. 32:04.747        55c8fbd1  3f797270 11a5d456 00000003 00000136 00000820
复制代码
3.合并: 将上面两个步骤合并成一条命令
  1. awk --non-decimal-data 'BEGIN{split("1:1000:60000",a,":")}   NR>1{n=split($1,b,":|\\.");for(i=n;i;i--)d+=b[i]*a[n-i+1];printf "%s\t%s\t",$0,int((d-c)/60000)":"int((d-c)%60000/1000)"."int((d-c)%60000%1000);c=d=0;for(i=2;i<=NF;i++){e[i]="0x"$i;printf "%08X\t",e[i]-f[i]};print ""}{n=split($1,b,":|\\.");for(i=n;i;i--)c+=b[i]*a[n-i+1];for(i=2;i<=NF;i++)f[i]="0x"$i}NR==1'   urfile
  2. 30:42.414  55c8fb7d  3f795cae  11a5c63c
  3. 30:42.418  55c8fb7f  3f795efc  11a5c63c  0:0.4     00000002  0000024E  00000000
  4. 30:42.426  55c8fb82  3f796168  11a5c664  0:0.8     00000003  0000026C  00000028
  5. 30:57.455  55c8fb85  3f7963f2  11a5c66e  0:15.29   00000003  0000028A  0000000A
  6. 30:57.459  55c8fb89  3f7966fe  11a5c664  0:0.4     00000004  0000030C  FFFFFFFFFFFFFFF6
  7. 31:21.786  55c8fbc8  3f796a50  11a5c5a6  0:24.327  0000003F  00000352  FFFFFFFFFFFFFF42
  8. 31:24.900  55c8fbcb  3f796d02  11a5c6e6  0:3.114   00000003  000002B2  00000140
  9. 31:24.904  55c8fbce  3f79713a  11a5cc36  0:0.4     00000003  00000438  00000550
  10. 32:04.747  55c8fbd1  3f797270  11a5d456  0:39.843  00000003  00000136  00000820
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
7 [报告]
发表于 2015-08-26 13:35 |只看该作者
本帖最后由 李满满 于 2015-08-26 13:37 编辑
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import datetime
  4. f_lines = open('source.txt', 'rub')
  5. ttmp = ('00:00.000', '0'*8, '0'*8, '0'*8)
  6. for line in f_lines:
  7.     stim = line.split()
  8.     ftim = datetime.datetime.strptime(stim[0], '%M:%S.%f')
  9.     ttim = datetime.datetime.strptime(ttmp[0], '%M:%S.%f')
  10.     diff = ftim - ttim
  11.     print '  '.join(ttmp), str(diff)[2:11],
  12.     print '  '.join(map(lambda x,y:hex(int(x, 16)-int(y, 16))[2:].zfill(8) ,stim[1:], ttmp[1:]))
  13.     ttmp = line.split()
复制代码
---------------------------------------------------------------------------------------------------
00:00.000  00000000  00000000  00000000 30:42.414 55c8fb7d  3f795cae  11a5c63c
30:42.414  55c8fb7d  3f795cae  11a5c63c 00:00.004 00000002  0000024e  00000000
30:42.418  55c8fb7f  3f795efc  11a5c63c 00:00.008 00000003  0000026c  00000028
30:42.426  55c8fb82  3f796168  11a5c664 00:15.029 00000003  0000028a  0000000a
30:57.455  55c8fb85  3f7963f2  11a5c66e 00:00.004 00000004  0000030c  000000xa
30:57.459  55c8fb89  3f7966fe  11a5c664 00:24.327 0000003f  00000352  00000xbe
31:21.786  55c8fbc8  3f796a50  11a5c5a6 00:03.114 00000003  000002b2  00000140
31:24.900  55c8fbcb  3f796d02  11a5c6e6 00:00.004 00000003  00000438  00000550
31:24.904  55c8fbce  3f79713a  11a5cc36 00:39.843 00000003  00000136  00000820

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2015-08-26 14:12 |只看该作者
回复 7# 李满满


    这 xa, xbe 的都是啥?

论坛徽章:
0
9 [报告]
发表于 2015-08-26 16:58 |只看该作者
已解决,谢谢 李满满 和 关阴月飞

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
10 [报告]
发表于 2015-08-26 17:19 |只看该作者
回复 1# xinxue123456
  1. awk '{split($1,a,/:/);t=a[1]*60+a[2];printf $0;if(NR>1){printf "\t%02d:%06s",(t-s[1])/60,(t-s[1])%60;for(i=2;i<=NF;i++)printf "\t%08x",strtonum("0x"$i)-strtonum("0x"s[i])}print ""}{s[1]=t;for(i=2;i<=NF;i++)s[i]=$i}' file
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP