繁体   English   中英

在AWK`rec = rec”中,“ $ i”无法按预期工作,其中$ i是记录中的每个字段

[英]In AWK `rec=rec“,”$i` doesn't work as expected, where $i is each field in a record

我将vmstat输出放在Linux机器上,如下所示:

# cat vmstat.out
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2675664 653028 3489156    0    0     1    19   22    7  5  1 94  0  0

我打算将每个字段下的值与时间戳一起保留在逗号分隔的格式中(当然,将其用作CSV文件,以后再传输到我们非常喜欢的MS Excel中)。 所以基本上这就是我想要的:

预期产量:

2016,05,19,23,53,58,1,0,0,2675664,653028,3489156,0,0,1,19,22,7,5,1,94,0,0

脚本:

cat vmstat.out | awk 'BEGIN{"date +'%Y,%m,%d,%H,%M,%S'"| getline dt;}{if (NR> 2) {i=1;while (i < NF) {rec=rec","$i; i++;} print dt,rec;}}'

我从脚本获得的输出:

2016,05,19,23,53,58 ,1,0,0,2675664,653028,3489156,0,0,1,19,22,7,5,1,94,0

请注意额外的空间: 58 ,1和预期输出中缺少最后一个0 我知道脚本中混乱的部分是: rec=rec","$i

如何解决这个问题?

无需重新设计awk功能

$ awk -v OFS=, 'BEGIN{time=strftime("%Y,%m,%d,%H,%M,%S")} 
                 NR>2{$1=$1; print time,$0}' file

2016,05,19,15,12,29,1,0,0,2675664,653028,3489156,0,0,1,19,22,7,5,1,94,0,0

在额外的空间58 ,1是因为你告诉AWK打印空间(OFS)DT之间(在此结束58 )和REC(其中开头,1用逗号) print dt,rec ,无关使用rec=rec","$i

缺少最后一个字段是因为您要告诉awk在最后一个字段之前停止循环。 while (i < NF)更改为while (i <= NF)可以解决此问题,但根本不需要循环(请参见下文)。

我假设您没有GNU awk,或者您将使用strftime()代替date

不要让shell调用awk来调用shell来调用date ,然后再使用pipe来获取getline (您正在不安全地使用btw,请参阅http://awk.freeshell.org/AllAboutGetline ):

awk 'BEGIN{"date +'%Y,%m,%d,%H,%M,%S'"| getline dt;} {script}'

只需具有shell调用date

awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') '{script}'

摆脱了UUOC之后,完整的脚本就是:

$ awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, 'NR>2{$1=dt OFS $1; print}' vmstat.out
2016,05,19,14,53,05,1,0,0,2675664,653028,3489156,0,0,1,19,22,7,5,1,94,0,0

i <= NF将处理丢失的尾随0。

而不是遍历这些字段,执行相同操作的一种更奇怪的方法是将OFS-输出字段分隔符设置为“,”。

awk ' BEGIN{OFS="," ; "date +'%Y,%m,%d,%H,%M,%S'"| getline dt;} {if (NR> 2) {$1=$1 ; print dt,$0;}} ' vmstat.out

其中的一个小故障是awk在更改某些内容之前不会重新格式化$ 0。 设置$ 1 = $ 1足以迫使awk做到这一点( 在awk中设置输出字段分隔符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM