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
显示您的预期输出会有很大帮助。
大编辑
我对计算有误,所以我需要重新计算。
原始样本数据:
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
显示您的预期输出会有很大帮助。