我正在尝试重新格式化串行输入,它由逗号分隔的两个整数组成(从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
(根据您的第一行)
第二 - 您在输出中看到的额外0
是system()
命令的返回值。这意味着它已成功运行。您可以简单地用引号运行 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