LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1239|回复: 14

两位两位数据变四位的问题

[复制链接]
发表于 2009-5-18 21:10:44 | 显示全部楼层 |阅读模式
一个txt文档中有一堆16进制的数据,看图~~~
想要变为:
FF00  0081  1881  1781 这样子四个四个的
想要要在matlab里边处理,可是数据量太大,matlab都死翘翘了
于是想到shell,自己技术不行,请教下大家~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2009-5-19 00:17:22 | 显示全部楼层
拜托以后给个能复制粘贴的样本
  1. huan@nb:~$ nl txt
  2.      1  FF 00 00 81 18 81 17 81
  3.      2  FF 00 00 81 18 81 17 81
  4.      3  FF 00 00 81 18 81 17 81
  5.      4  FF 00 00 81 18 81 17 81
  6.      5  FF 00 00 81 18 81 17 81
  7.      6  FF 00 00 81 18 81 17 81
  8.      7  FF 00 00 81 18 81 17 81
  9. huan@nb:~$ perl -lpe 's/(\w\w)\s(\w\w)\s?/$1$2 /g' txt
  10. FF00 0081 1881 1781
  11. FF00 0081 1881 1781
  12. FF00 0081 1881 1781
  13. FF00 0081 1881 1781
  14. FF00 0081 1881 1781
  15. FF00 0081 1881 1781
  16. FF00 0081 1881 1781
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-19 09:14:02 | 显示全部楼层
非常感谢~~~
能不能不用perl呀,样本来了~~~
样本的文本内容比较多,大几十MB甚至可能上百MB,不知道处理速度如何

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2009-5-19 14:34:54 | 显示全部楼层

  1. awk '{ i=1; while( i<=NF ) { printf $i; printf ( i % 2 ? "" : " " ); i++}; printf "\n"; }'
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-5-20 11:20:58 | 显示全部楼层
matlab会挂,是因为读入数据占用内存太大了。

可以考虑分段处理。

两位变四位,这样不会修改样本值么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-21 17:48:39 | 显示全部楼层
非常感谢huan,刚刚试了perl命令,非常好用~~~

本来采集的数据就是4位4位的,但是十六进制打开就是2位2位的

新问题来了
数据里边为了确认没有掉帧,人为的加入了些帧计数,比如EB 90 00 00 01开始
然后规律的出现EB 90 00 00 02一直递增(十六进制计数),EB 90 肯定不变
现在想过滤掉这些帧计数,请大侠们继续帮忙呀(这个估计在合并4位之前处理比较好~~)
回复 支持 反对

使用道具 举报

发表于 2009-5-21 18:36:29 | 显示全部楼层
要是用awk,就直接把huan兄的awk里加上!/^EB 90/就行了(在大括号“{”前面)。
awk '!/^EB 90/{ i=1; while( i<=NF ) { printf $i; printf ( i % 2 ? "" : " " ); i++}; printf "\n"; }'  wwww.txt
sed  -e '/^EB 90/d' -e 's/\([^ \t][^ \t]\) \([^ \t][^ \t]\)/\1\2/g' wwww.txt

————
额……
我试验上面两条。发现sed要比awk慢
回复 支持 反对

使用道具 举报

发表于 2009-5-21 19:49:30 | 显示全部楼层
Post by wjping119;1989582
非常感谢huan,刚刚试了命令,非常好用~~~

本来采集的数据就是4位4位的,但是十六进制打开就是2位2位的

新问题来了
数据里边为了确认没有掉帧,人为的加入了些帧计数,比如EB 90 00 00 01开始
然后规律的出现EB 90 00 00 02一直递增(十六进制计数),EB 90 肯定不变
现在想过滤掉这些帧计数,请大侠们继续帮忙呀(这个估计在合并4位之前处理比较好~~)

你是说原本是二进制的数据文件,转成了十六进制表示的txt文本
为什么要这样处理呢
之后还要作什么处理,不能直接读取二进制的数据文件吗
本来一个字节8位二进制可表示00至FF,你说的4位就是0000至FFFF,本来只要2个字节,现在要4个字母/数字表示,要4字节,占用空间大了一倍,还要再加空格
觉得后期程序应该直接读取二进制数据文件
顺便问下,采集数据时是高位在前,还是低位在前
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-21 20:38:00 | 显示全部楼层
回Kgnn:我们采集的数据本来就是16进制的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-21 20:59:10 | 显示全部楼层
Post by tomgrean;1989600
要是用awk,就直接把huan兄的awk里加上!/^EB 90/就行了(在大括号“{”前面)。
awk '!/^EB 90/{ i=1; while( i<=NF ) { printf $i; printf ( i % 2 ? "" : " " ); i++}; printf "\n"; }'  wwww.txt
sed  -e '/^EB 90/d' -e 's/\([^ \t][^ \t]\) \([^ \t][^ \t]\)/\1\2/g' wwww.txt

————
额……
我试验上面两条。发现sed要比awk慢


我刚测试了两条命令,似乎都没有什么用,汗~~~ !还是仅仅把2位合并成了4位。不知是我自己错误还是命令本身的问题,继续寻求帮助。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表