awk - 用awk读取串行输入,插入日期

标签 awk serial-port

我正在尝试重新格式化串行输入,它由两个用逗号分隔的整数组成(从 Arduino 发送):

1,2
3,4
0,0
0,1

等我想在每一行之后附加日期,用制表符分隔所有内容。到目前为止,这是我的代码:

cat /dev/cu.usbmodem3d11 | awk 'BEGIN {RS=","};{printf "%i\t%i\t%s",$1,$2,system("date")}'

这是我得到的结果(在我的语言环境中有日期):

1   2   0Mer 26 fév 2014 22:09:20 EST
3   4   0Mer 26 fév 2014 22:09:20 EST
0   0   0Mer 26 fév 2014 22:09:20 EST
0   1   0Mer 26 fév 2014 22:09:20 EST

为什么我的日期字段前面多了一个“0”?抱歉新手问题:(

编辑 这段代码解决了我的问题。感谢所有提供帮助的人。

awk 'BEGIN {FS=","};{system("date")|getline myDate;printf "%i\t%i\t%s",$1, $2, myDate}' /dev/cu.usbmodem3d11

我不清楚为什么,但是为了让日期不断更新并记录接收数据的时间,我必须使用 system("date") 而不是 “日期”在上面的代码中。

最佳答案

2 件事

如果您在 printf 字符串的末尾添加一个 \n 会更容易看到您的问题

那么输出就是

>echo '1,2' | awk 'BEGIN {RS=","};{printf "%i\t%i\t%s\n",$1,$2,system("date")}'
Wed Feb 26 21:30:17 CST 2014
1       0       0
Wed Feb 26 21:30:17 CST 2014
2       0       0

我猜测 system("date") 的输出返回其输出在 awk 的 $0 处理的每一行输入的自然范围的“外部”范围。其他人也许能够提供更好的解释。

为了获得您想要的输出,我使用 getline 函数将 date 命令的输出捕获到一个变量 (myDt).现在输出是

> echo '1,2' | awk 'BEGIN {RS=","};{"date" | getline myDt ; printf "%i\t%i\t%s\n",$1,$2,myDt}'
1       0       Wed Feb 26 21:31:15 CST 2014

2       0       Wed Feb 26 21:31:15 CST 2014

最后,我们删除“调试”\n 字符,并获得您指定的输出:

> echo '1,2' | awk 'BEGIN {RS=","};{"date" | getline myDt ; printf "%i\t%i\t%s",$1,$2,myDt}'
1       0       Wed Feb 26 21:34:56 CST 2014
2       0       Wed Feb 26 21:34:56 CST 2014

而且,根据 Jaypal 的帖子,我现在看到 FS="," 是另一个问题,所以当我们进行更改并返回 `\n' 字符时,我们有

echo '1,2' | awk 'BEGIN {FS=","};{"date" | getline myDt ; printf "%i\t%i\t%s\n",$1,$2,myDt}'
1       2       Wed Feb 26 21:44:42 CST 2014

关于awk - 用awk读取串行输入,插入日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058379/

相关文章:

Python + Arduino 与 Mac OS X

c++ - 串行编程(硬件握手)

linux - 嵌入式linux串行终端多路复用器

linux - 如何在包含模式 [ :alpha:], 的任何行之前添加字符串 "<fc=ff00>"但不添加两个连续行?

linux - 低优先级进程延迟的实时进程中的串行通信 (Linux)

linux - 将 TCP 数据重定向到 ttyS0

regex - 将每列中的第一个匹配项替换为 bash

bash - CSV 文件的文本处理

linux - 如何使用 sed 或 awk 正则表达式在 linux shell 中解析此数据

join - 使用 awk 合并两个表以创建新结果