AWK输出中不需要的零

时间:2014-11-18 14:51:02

标签: linux bash awk terminal cut

问题解释

在Ubuntu上使用bash,我使用 java prog 通过串口(它连接到无线基站)连续读取一些数据包并通过{{1}传递它}和cut得到一个结果。我使用awk来实时查看输出(否则输出会一直等到缓冲区已满)。

我在终端上发出的命令的语法:

unbuffer

我发出的实际命令:

java prog | unbuffer -p process1 | unbuffer -p process2

我的输出:

java net.tinyos.tools.Listen -comm serial@/dev/ttyUSB0:telosb |
unbuffer -p cut -c49-50,52-53,55-56,58-59,60,61-62,64-65,67-68,70-71,72,73-74,76-77,79-80,82-83 |
unbuffer -p awk -F " " '{printf("%d %5.4f %5.4f\n",("0x"$1)*1,("0x"$2)*2*0.0005714,("0x"$3)/612500)}'

零线不是真实的,而是虚假的。如果我只执行 java prog (即在43301 1.9370 5.0124 0 0.0000 0.0000 43303 1.9279 5.0071 0 0.0000 0.0000 43305 1.9428 5.0125 0 0.0000 0.0000 43306 1.9428 5.0072 0 0.0000 0.0000 . . . 之前)或 java prog + process1 (即在cut之前),他们不会出现了。在使用AWK之后,它们仅在 process2 之后出现在输出中。

我想要什么

我想知道为什么我的输出中存在零,以及如何。

感谢您的帮助。感谢。


补充数据

其中一个收到的数据包如下所示(在 java prog 之后输出)。所有都是awk(在此阶段未分组):

hex

在上面,看起来所有数字都是两个一组。但是内部有数字集群 - 因此为什么我 00 FF FF 00 01 1C 22 95 00 00 00 00 00 00 00 00 00 00 25 83 00 00 06 95 00 2E BF 60 00 2E C0 BB 00 00 00 00 以这种方式重新组合它们。 cut之后的输出如下:

java prog + process1 之后的输出:

cut

注意:两个输出不是他们自己的转换。它们是在不同的情况下拍摄的,只是为了提供一个例子。

2 个答案:

答案 0 :(得分:3)

您正在使用printf("%d \n","0x"$1),即printf期望数字为Ox$1的值。因此,当它不是数字时,awk会打印0

您可能希望使用%s代替,以便打印字符串。

查看示例:

$ awk 'BEGIN {printf("%d \n","0xAA")}'
0 
$ awk 'BEGIN {printf("%s \n","0xAA")}'
0xAA 

您可以在awk手册中查看printf的格式控制字母的完整列表:http://www.gnu.org/software/gawk/manual/gawk.html#Control-Letters

有趣的阅读与awk和gawk中的十六进制值有关:http://www.delorie.com/gnu/docs/gawk/gawk_77.html

答案 1 :(得分:2)

所以,我回答了我的问题的灵感来自我得到的答案+伟大的评论和帮助花絮。

问题

使用awk。没有安装gawk

命令:

 java net.tinyos.tools.Listen -comm serial@/dev/ttyUSB0:telosb |
 unbuffer -p cut -c49-50,52-53,55-56,58-59,60,61-62,64-65,67-68,70-71,72,73-74,76-77,79-80,82-83|
 unbuffer -p awk -F " " '{printf("%d\t%5.4f\t%5.4f\t\n","0x"$1,("0x"$2)*2*0.0005714,("0x"$3)/612500)}'

输出:

 2723   1.9233  5.0164  
 0  0.0000  0.0000  
 2726   1.9268  5.0164  
 0  0.0000  0.0000  
 2730   1.9428  5.0073  
 0  0.0000  0.0000  
 2732   1.9348  4.9866  
 0  0.0000  0.0000
 .
 .
 .

零是不受欢迎的。

解决方案

已安装gawk。使用它,我更改了命令,如下所示:

命令:

 java net.tinyos.tools.Listen -comm serial@/dev/ttyUSB0:telosb |
 unbuffer -p cut -c49-50,52-53,55-56,58-59,60,61-62,64-65,67-68,70-71,72,73-74,76-77,79-80,82-83|
 gawk -F " " --non-decimal-data '{printf("%d\t%5.4f\t%5.4f\t\n","0x"$1,("0x"$2)*2*0.0005714,("0x"$3)/612500)}'

输出:

 2723   1.9233  5.0164  
 2726   1.9268  5.0164  
 2730   1.9428  5.0073  
 2732   1.9348  4.9866  
 .
 .
 .

Zeros走了。仅更改为gawk而非awk,添加了--non-decimal-data选项,并删除了unbuffer -p

注意:当我离开unbuffer -p时,零会重新出现。值得深思。也许,有人可以稍后再照顾。