我正在尝试重新格式化串行输入,它由两个用逗号分隔的整数组成(从 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/