Linux 中 awk 实现 每四个一组计算每组第四个和第一个之间的差值

 

001、方法1(基本逻辑是先提取每组的第一行和第四行; 然后将没两行转换为1行;最后将第二行再减去第一行)

[root@PC1 test2]# ls
a.txt
[root@PC1 test2]# cat a.txt                    ## 测试数据
2.699350
2.699359
2.699940
2.699946
3.075009
3.075016
3.075111
3.075118
[root@PC1 test2]# awk 'NR % 4 == 1 || NR % 4 == 0' a.txt | sed 'N; s/\n/\t/' | awk '{print $2 " - " $1 " = " $2 - $1}'         ## awk + sed 实现
2.699946 - 2.699350 = 0.000596
3.075118 - 3.075009 = 0.000109

 

002、方法2 借助awk数组 和 条件分支实现

[root@PC1 test2]# ls
a.txt
[root@PC1 test2]# cat a.txt                      ## 测试数据
2.699350
2.699359
2.699940
2.699946
3.075009
3.075016
3.075111
3.075118
[root@PC1 test2]# awk '{if(NR % 4 == 1) {ay1[1] = $0}; if(NR % 4 == 0) {ay1[2] = $0; print ay1[2] " - " ay1[1] " = " ay1[2] - ay1[1]}}' a.txt      ## 借助awk数组和条件分支实现 
2.699946 - 2.699350 = 0.000596
3.075118 - 3.075009 = 0.000109

 

 。

 

003、博文中的答案

[root@PC1 test2]# ls
a.txt  cal.awk
[root@PC1 test2]# cat a.txt          ## 测试数据
2.699350
2.699359
2.699940
2.699946
3.075009
3.075016
3.075111
3.075118
[root@PC1 test2]# cat cal.awk       ## 编辑一个awk脚本
{
ay1[NR] = $1                       
if(NR % 4 == 0)
{
first = ay1[NR - 3]
second = ay1[NR]
diff = second - first
printf("%.6f - %.6f = %.6f\n", second, first, diff )
}
}
[root@PC1 test2]# awk -f cal.awk a.txt              ## 运行程序
2.699946 - 2.699350 = 0.000596
3.075118 - 3.075009 = 0.000109
[root@PC1 test2]# cat a.txt | awk -f cal.awk        ## 运行程序
2.699946 - 2.699350 = 0.000596
3.075118 - 3.075009 = 0.000109

 。

 

 

reference:

01、https://mp.weixin.qq.com/s?__biz=Mzg4ODA5NDEwNw==&mid=2247484651&idx=1&sn=4a449cc1008694ef080dc5f6619a67ba&chksm=cf81281ff8f6a109e336229dcf058082116f295b98eb7852b8eba1a8dd934bbae6d3ee3a53e9&mpshare=1&scene=23&srcid=0526HHs62l371OKEpnIae3cp&sharer_shareinfo=e1e29752c7114989a7f9ef318ad5baa1&sharer_shareinfo_first=e1e29752c7114989a7f9ef318ad5baa1#rd

 

posted @ 2024-05-26 22:49  小鲨鱼2018  阅读(22)  评论(0编辑  收藏  举报