awk 基于字段值的计算

awk calculations based on field value

大编辑

我对计算有误,所以我需要重新计算。

原始样本数据:

2600,AEIOU-2600,stack,01,04/28/2015,C C R,S,1.07
2600,AEIOU-2600,stack,02,04/01/2015,C C S,S,10.65
2601,"over, L.P. - 00001",stack,01,04/01/2015,C C S,s,16.43
2601,"over, L.P. - 000001",stack,02,04/01/2015,D C S,s,17.16
2602,UEIA,stack,01,04/28/2015,C C R,s,10
2602,UEIA,stack,02,04/28/2015,C C R,s,20

字段 $1:数字

字段 $2:名称

字段 $3:帐户

字段 $4:发票编号

字段 $5:日期

字段 $6:类型

字段 $7:州

字段 $8:金额

脚本:

#!/usr/local/bin/gawk -f

BEGIN {
FPAT = "\"[^\"]*\"|[^,]*"

OFS = ","
}
NR > 1 {
arr[ OFS  OFS ]++
}
END {
for (key in arr)
    print key, arr[key]
}

上面脚本的输出:

2601,"over, L.P. - 000001",D C S,1
2601,"over, L.P. - 00001",C C S,1
2602,UEIA,C C R,2
2600,AEIOU-2600,C C S,1

我需要根据字段 $1 进行分组,然后根据字段 $6 进行分组。

脚本运行后,它将生成如下所示的数据:

2600,AEIOU-2600,C C R,1,1.07
2600,AEIOU-2600,C C S,1,10.65
2601,"over, L.P. - 00001",C C S,2,33.59
2602,UEIA,C C R,2,30

我们看到2600有两种不同的类型,所以他们都有自己的线,我们看到2601有两个C C S加起来是33.59。基本上在 $1 字段上分组,然后在 $6 字段上分组。

然后我可以将 C C R 和 C C A 的结果乘以 .02(出现次数),其他所有结果乘以其总数 * .02*.0013。

2600,AEIOU-2600,C C R,1,1.07,0.0214
2600,AEIOU-2600,C C S,1 10.65,0.0002769
2601,"over, L.P. - 00001",C C S,2,33.59,0.00087334
2602,UEIA,C C R,2,30,0.00078

字段 $1:数字

字段 $2:名称

字段 $3:类型

字段 $4:出现次数

现场总计 5 美元

字段 $5:calc_total

编辑

#!/usr/local/bin/gawk -f

BEGIN {
FPAT = "\"[^\"]*\"|[^,]*"

OFS = ","
}
NR > 1 {
    arr[ OFS  OFS  OFS ]++
}
END {
    for (key in arr)
        print key, arr[key]
}

情况越来越好,但现在我需要第二组并将其按字段 $3 分组。现在上面的脚本按 $1 分组,然后按 $5 分组。

这是您要找的吗?

$ cat tst.awk
BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; OFS="," }
{ print [=10=],  * .02 * ( ~ /C C [RA]/ ? 1 : .013) }

$ awk -f tst.awk file
30409,DPUMA - 147803,D C S,2,0.00052
30392,"SNI TIC , L.P. - 93001",C C S,175,0.0455
30425,QJEU - 98701,C C R,1,0.02
30397,"LSRNC , L.P. - 01236",D C S,124,0.03224
30432,SLRNT - 32014,C C S,1,0.00026
30425,QCET - 89701,C C R,10,0.2
30425,QLRU - 50701,C C R,30,0.6

显示您的预期输出会有很大帮助。