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