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



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

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

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

cat /dev/cu.usbmodem3d11 | awk 'BEGIN {RS=","};{printf "%it%it%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 "%it%it%s",$1, $2, myDate}' /dev/cu.usbmodem3d11

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

2 件事

如果在printf字符串的末尾添加n,将更容易看到您的问题

然后输出为

>echo '1,2' | awk 'BEGIN {RS=","};{printf "%it%it%sn",$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 "%it%it%sn",$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 "%it%it%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=","是另一个问题,所以当我们进行更改并返回""字符时,我们有

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

两个问题:

第一个 - RS是记录分隔符。您需要FS字段分隔符来分隔两列,其中$1将被1$2将被2(根据您的第一行)

第二 - 您在输出中看到的额外0system()命令的返回值。这意味着它已成功运行。您可以简单地用引号运行 shell 命令并将其通过管道传输到 getline 。将变量放在它之后将允许您捕获返回的值。

试试这个:

 awk 'BEGIN {FS=","};{"date"|getline var;printf "%it%it%sn",$1,$2,var}'

这是一个更简单的解决方案:

awk -F, '{print $1,$2,dt}' dt="$(date)" OFS="t" /dev/cu.usbmodem3d11
1       2       Thu Feb 27 06:23:41 CET 2014
3       4       Thu Feb 27 06:23:41 CET 2014
0       0       Thu Feb 27 06:23:41 CET 2014
0       1       Thu Feb 27 06:23:41 CET 2014

如果您想以其他格式显示日期,请阅读手册以获取date
Eks dt="$(date +%D)" 给出02/27/14

最新更新