在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
注意:两个输出不是他们自己的转换。它们是在不同的情况下拍摄的,只是为了提供一个例子。
答案 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
时,零会重新出现。值得深思。也许,有人可以稍后再照顾。