如何使用awk减去不同行中的某些值?

时间:2019-05-31 06:55:15

标签: unix awk

我有一个用“ |”分隔的数据。该日期每15分钟发生一次。我想要做的是减去此数据并将其乘以100,但似乎没有用。

bash-4.2$ cat kresna.txt 
2019-05-29 16:48:01||196579|1637589633|0|109423435|101347165|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||0|0|111|1554983|1554990|0||0|6347782|0|0|0|0|||1637602667|8747|13287295146|283512|1636036853|38771|||326516100|101703893|145340456|6988739|224616616|107247291|7764|101598218|19745231|0
2019-05-29 17:03:01||197446|1637876915|0|109456309|101349847|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||0|0|111|1552437|1552441|0||0|6336110|0|0|0|0|||1637889948|8747|13290533845|283553|1636326689|38771|||326591972|101734973|145373623|6990480|224660545|107268556|7764|101629298|19748302|0

awk -F "|" '{if(NR>1){print (1 - ($45+$47+$49-_m) / ($44+$46+$48-_n) *100)};_n=$44+$46+$48;_m=$45+$47+$49}' kresna.txt
0.998926

该预期输出为e 99.98

1 个答案:

答案 0 :(得分:1)

除了算术操作数的分组不正确之外,我看不到代码有问题。您想对先前除法的值执行100的乘法运算。因此,请执行以下操作。进一步摆脱if else语句

awk -F "|" 'NR > 1 { print ((1 - ($45+$47+$49-_m) / ($44+$46+$48-_n)) *100)} { _n=$44+$46+$48; _m=$45+$47+$49 }'
99.9989

即使使用printf(),也需要至少3个精度字符才能打印它,而无需将值四舍五入到下一个整数

awk -F "|" 'NR > 1 { printf "%.3f\n", ((1 - ($45+$47+$49-_m) / ($44+$46+$48-_n)) *100)} { _n=$44+$46+$48; _m=$45+$47+$49 }'
99.999