【问题标题】:how to calculate on the fly with awk using previous and next line values如何使用 awk 使用上一行和下一行值即时计算
【发布时间】:2018-02-23 05:51:25
【问题描述】:

如何使用 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 相同,而不是之前的值!

测试日志:

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

这只会将计算作为输出!

谢谢

【问题讨论】:

  • 您是否在问是否可以创建一个工具来修改它正在读取的文件,同时该文件也正在被其他进程写入?
  • 您必须通过 awk 管道输出才能做到这一点。 your-log-producer | awk '[your calculations]' > test.log
  • 是的,@EdMorton,正确我需要一些额外的 awk 行或其他工具来修改原始日志文件,并在第 7 列进行计算。我将添加一些有关使用数字创建日志文件的单行器的更多信息!

标签: awk


【解决方案1】:
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

输出:

$ 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
$1         $2         $3        $4        $5        $6  $7
2018/02/21 14:00:24   911       848       958       719 0
2018/02/21 14:00:34   978       848       998       966 0.445833

【讨论】:

  • 我实际上有一个 awk 脚本来通过解析日志文件来获取计算,但它不像你的答案那样即时!在我的问题中查看我的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多