如何使用awk使用上一行和下一行值进行动态计算

时间:2018-02-21 19:25:53

标签: awk

如何使用awk读取值并使用之前的值和下一个值进行计算,并将其添加到每行的其他列中:

示例test.log:

$1         $2         $3        $4        $5        $6
2018/02/21 14:00:24   911       848       958       719
2018/02/21 14:00:34   978       848       998       966

第7栏:

$1         $2         $3        $4        $5        $6        $7
2018/02/21 14:00:24   911       848       958       719       0.0
2018/02/21 14:00:34   978       848       998       966       0.45

第7列应通过以下函数计算:

(($3-prev3)+($5-prev5))/240 = ((978-911)+(998-958))/240

日志文件中的第一行只能有第7列的0.0!

我的问题是,我希望将第7列即时添加到日志文件中,而不是仅在打印输出完成后才添加:

awk '{a=$3;b=$5;getline;print(($3-a)+($5-b))/240}' test.log

我该怎么做? 是否有可能在当前行并存储在先前值的变量中?

使用6列应该动态创建日志文件的单行添加第7列并进行上述计算:

while true; do echo `date +"%Y/%m/%d %H:%M:%S"` "#" `echo $RANDOM` "#" `echo $RANDOM` "#" `echo $RANDOM` "#" `echo $RANDOM` | awk -F# '{printf "%-20s %-15s %-15s %-15s %-15s\n",$1,$2,$3,$4,$5}'>>test.log; sleep 10; done

此尝试也不起作用,因为它总是在第7列添加0:

awk -F# '{a=$3;b=$5;printf "%-20s %-15s %-15s %-15s %-15s %-15s\n",$1,$2,$3,$4,$5,(($3-a)+($5-b))/240}'

我认为a,b与$ 3& 5美元而不是以前的价值!

test.log中:

2018/02/22 03:37:12   10241           29132           3358            17816          0
2018/02/22 03:37:17   12464           21254           16716           10024          0

使用awk脚本的一个解决方案,但它不是即时解决方案:

awk '{a=$3;b=$5;getline;print(($3-a)+($5-b))/240}' test.log

仅将计算作为输出!

由于

1 个答案:

答案 0 :(得分:0)

bundle update rake

输入:

awk -v OFS="\t" 'FNR==1{
                         print $0, "$7"; 
                         next
                 }
                 p3!=""{
                         n=(($3-p3)+($5-p5))/240
                 }
                 {
                     p3=$3; 
                     p5=$5; 
                     print $0,n+0
                 }
                ' infile

输出:

$ cat infile
$1         $2         $3        $4        $5        $6
2018/02/21 14:00:24   911       848       958       719
2018/02/21 14:00:34   978       848       998       966