Chinaunix

标题: shell如何处理16进制值累计 [打印本页]

作者: 苏州大鱼    时间: 2014-01-27 15:34
标题: shell如何处理16进制值累计
有类似这样一个xml

<?xml version="1.0"?>
<test>
<Number>1000</Number>
<Start>00E011223300</Start>
<Tag ID="aaa"><CRC>916ea803</CRC></Tag>
<Tag ID="ert"><CRC>213727c7</CRC></Tag>
<Tag ID="asd"><CRC>213727c7</CRC></Tag>
</test>

提取里面的ID 生成下面这样的格式:

aaa 00E011223300
ert 00E011223301
asd 00E011223302
......


每个提取ID我会了,现在就是如何处理那个16进制的Start值累加,同时附在后面?
作者: 苏州大鱼    时间: 2014-01-27 15:53
嗯,我想了下和xml无关了

给一个16进制值,如:00E011223300
在文本每一行后面附加它的累计

asdasdasd
adadadasd
12121sada
asdasdad1
121212121

出来这样的:

asdasdasd 00E011223300
adadadasd 00E011223301
12121sada 00E011223302
asdasdad1 00E011223303
121212121 00E011223304

不知道怎么弄,感觉用awk或sed可以的
作者: 苏州大鱼    时间: 2014-01-27 16:09
  1. test$ awk -v s=00E0 '{print $0 FS s++}' test1.txt
  2. asdasdasd 0
  3. adadadasd 1
  4. 12121sada 2
  5. asdasdad1 3
  6. 121212121 4
  7. asdasdasd 5
  8. adadadasd 6
  9. 12121sada 7
  10. asdasdad1 8
  11. 121212121 9
  12. asdasdasd 10
  13. adadadasd 11
  14. 12121sada 12
  15. asdasdad1 13
  16. 121212121 14
复制代码

作者: 苏州大鱼    时间: 2014-01-27 16:10
我出来是这种结果,我想要的是16进制的表示和累计
00E0
00E1
00E2
作者: nathanielwen    时间: 2014-01-27 16:30
  1. [root@localhost test]# awk -v s=0 '{printf("%s 00E%x\n",$0,s++)}' test1.txt
  2. asdasdasd 00E0
  3. adadadasd 00E1
  4. 12121sada 00E2
  5. asdasdad1 00E3
  6. 121212121 00E4
  7. asdasdasd 00E5
  8. adadadasd 00E6
  9. 12121sada 00E7
  10. asdasdad1 00E8
  11. 121212121 00E9
  12. asdasdasd 00Ea
  13. adadadasd 00Eb
  14. 12121sada 00Ec
  15. asdasdad1 00Ed
  16. 121212121 00Ee
复制代码

作者: jiejie455    时间: 2014-01-27 16:35
awk 'BEGIN{FS="[><]"};/Start/{start=$3};/<\/CRC>/{ "echo \"obase=ibase=16;"start"+1\"|bc"|getline a;print $2,a;start=a}' data
作者: jiejie455    时间: 2014-01-27 16:42
awk 'BEGIN{start="00E011223300"}{"echo \"obase=ibase=16;"start"+1\"|bc"|getline a;print $1"\t"a;start=a}' data
作者: jason680    时间: 2014-01-27 16:59
回复 1# 苏州大鱼

h2a for Hex to ASCII (ex: number 12 --> char "C")
a2h for ASCII to hex (ex: char "D" --> number 13)

$ awk -vs=00E011223300 'BEGIN{split("123456789ABCDEF",h2a,"");;h2a[0]="0";for(n=0;n<=15;n++)a2h[h2a[n]]=n}function hex_add(x,A){R="";for(n=length(x);n>0;n--){N=a2h[substr(x,n,1)]+A;A=N>15?1:0;R=h2a[N%16]""R}return R}{print $1,s;s=hex_add(s,1)}' FILE
asdasdasd 00E011223300
adadadasd 00E011223301
12121sada 00E011223302
asdasdad1 00E011223303
121212121 00E011223304

   
作者: ly5066113    时间: 2014-01-28 14:55
回复 1# 苏州大鱼


这个意思?
  1. awk -F '[>"<]' '/Start/{n=strtonum("0x"$3)}/Tag/{printf "%s\t%012X\n",$3,++n}' xmlfile
复制代码

作者: 苏州大鱼    时间: 2014-01-28 15:26
回复 9# ly5066113

谢谢阿,我再学习下


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2