awk编程?let‘s go(八) ---- 数据处理

21 篇文章 1 订阅
8 篇文章 0 订阅
这篇博客介绍了如何使用awk工具进行数据转换和归约,特别是针对数据列的求和操作。通过示例代码展示了如何在awk中计算每一列的和,并记录最长字段数。同时,提到了处理非数值字段的方法,以及如何扩展功能来计算百分比和分位数,这对于日常的数据处理和分析非常实用。
摘要由CSDN通过智能技术生成

前言

经过前面几节的学习,我们对 awk 的基础功能以及 awk 语言有了一定的认知,虽然前面有很大一部分属于理论的东西,l老是让我看理论,
在这里插入图片描述

从这节开始,我们将更加深入的学习 awk。
Awk 最初的设计目标是用于日常的数据处理, 例如信息查询, 数据验证, 以及数据转换与归约,所以这节我们将来学习 awk 的数据处理,利用前面学习的知识实现更加强大的功能。

数据转换与归约

Awk 最常用的一个功能是把数据从一种形式转换成另一种形式, 通常情况下, 是把一种程序的输出格式, 转换成另一种程序要求的格式. 另一个常用的功能是从一个大数据集中提取相关的数据,例如下面的例子:

列求和

需求:每一个输入行都含有若干个字段, 每一个字段都包含数字, 程序的任务是计算每一列的和, 而不管该行有多少列。

思路:要求每列的和,一定是需要一个数组来储存和,又因为每列的字段数不一定,因此到底要计算多少次加和或者说记录处理多少个字段,需要一个变量来记录最大的字段数
有了上面的思路,程序也就不那么难了,看代码

awk '{
	for (i = 1; i < NF; i++) {
		sum[i] += $i
		}
		# 记录最长的字段
		if (maxFieldCount < NF) {
			maxFieldCount = NF
		}
	}
		END {
			for (i = 1; i < maxFieldCount; i++ ) {
				printf("%g", sum[i])
				if (i < maxFieldCount) {
					printf("\t")
				} else {
					printf("\n")
				}
			}
		}' $*

假设某些字段不是数值型, 所以它们不能被计算在内。策略是新增一个数组 numcol,用于跟踪数值型字段, 函数 isnum 用于检查某项是否是一个数值, 由于用到了函数, 所以测试只需要在一个地方完成, 这样做有助于将来对程序进行修改。如果程序足够相信它的输入, 那么只需要查看第 1 行就够了, 我们仍然需要记录字段数, 因为在 END 中, NF 的值是零。
sum.awk

#!/usr/bin/bash

     awk 'NR == 1 { fieldCount = NF;
                for (i = 1; i <= NF; i++) {
                        numcol[i] = isnum($i)
                }
           }
                {
                for (i = 1; i <= NF; i++) {
                                if (numcol[i]) {
                                        sum[i] += $i
                                }
                        }
                } 
                function isnum(n) { return n ~ /^[+-]?[0-9]+$/}
                END { for (i = 1; i < fieldCount; i++) {
                        if (numcol[i]) {
                                printf("%g",sum[i])
                        } else {
                                printf("--")
                        }
                        printf(i < nfld ? "\t" : "\n") 
                }       
         }' $*

计算百分比与分位数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不务正业的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值