首页 > 解决方案 > 如何使用awk从最后一条记录中减去多列中的值等等?

问题描述

我需要有关 AWK 中此脚本的帮助。对于每一列的每个字段,我想像这个例子一样减去值:

2007 - 2004 = 3  
505 - 505 = 0
386 - 386 = 0 

等等接下来的列...

我的文件格式如下

20200224 09:00:50 1998 503 384 439 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:00:55 2003 503 386 440 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:01:00 2004 505 386 444 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:01:01 2007 505 386 446 110 132 126 17 0 26 29 14 2 0 4 21 0 0

像这样的输出格式:

20200224 09:00:50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:00:55 5 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:01:00 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:01:01 3 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0

标签: awk

解决方案


这个 awk 单行代码将帮助您:

awk '{for(i=3;i<=NF;i++){t[i]=$i;$i=NR==1?0:$i-a[i];a[i]=t[i]}}7' file

使用您的数据进行测试:

kent$  cat f
20200224 09:00:50 1998 503 384 439 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:00:55 2003 503 386 440 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:01:00 2004 505 386 444 110 132 126 17 0 26 29 14 2 0 4 21 0 0
20200224 09:01:01 2007 505 386 446 110 132 126 17 0 26 29 14 2 0 4 21 0 0

kent$  awk '{for(i=3;i<=NF;i++){t[i]=$i;$i=NR==1?0:$i-a[i];a[i]=t[i]}}7' f
20200224 09:00:50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:00:55 5 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:01:00 1 2 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20200224 09:01:01 3 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0

推荐阅读