命令调用 : awk -f command.awk -F “,” -v key1=1,2 -v sumItem=4 awk_test.txt > sum.txt
说明:
1.-f command.awk 脚本文件
2.-F “,” 文本分割符号
3.-v key1=1,2 传参,key1=1,2 区分的key是第1个字段和第二个字段,如果只有一个不写“,”
如果是多个字段组合,就写列号,并用“,”隔开。
4.-v sumItem=4 传参 需要合计的字段,只能指定一个
5.awk_test.txt 需要处理的文件名
6.sum.txt处理完的文件名
以第1,2字段为key,合计第4个字段:
输入:
1,Amit,A,80,ss
1,Amit,B,80,ff
输出:
1,Amit,B,160,ff
例:
输入文件内容:
1,Amit,A,80,ss
1,Amit,B,80,ff
2,Rahul,C,90,ds
3,Shyam,D,87,fr
4,Kedar,E,85,dd
5,Hari,F,89,12
5,Hari,F,1,12
6,Kedar,G,85,dd
输出文件内容:
1,Amit,B,160,ff
2,Rahul,C,90,ds
3,Shyam,D,87,fr
4,Kedar,E,85,dd
5,Hari,F,90,12
6,Kedar,G,85,dd
文件 command.awk:
#awk -f command.awk -F "," -v key1=1,2 -v sumItem=4 awk_test.txt > sum.txt
# BEGIN block(s)
BEGIN {
#kubuKeyArym 合计列Index数组 key1 传入参数
split(key1,kubuKeyArym,",")
# sumItem 合计列index
#记录合计key的数组
sumKeyAry[0] = ""
#记录每一行除过合计item的列的值
linAry[0] = ""
#记录合计值
sumValueAry[0] = ""
#key相同的行号数组
keyIndexAry[0] = 0
#NR 当前记录数。相当于行号
#NF 当前记录中的字段数。
#key相同的count数
keyCount = 0
#FS 域分隔符
}
# Rule(s)
{
#print "NR,NF = " NR","NF
linKey = ""
for(x in kubuKeyArym){
linKey = linKey "," $kubuKeyArym[x];
}
if(sumKeyAry[keyCount] == linKey){
sumValueAry[keyCount] += $sumItem;
}else{
keyCount++;
sumKeyAry[keyCount] = linKey;
sumValueAry[keyCount] = $sumItem;
}
#NF 当前记录中的字段数。
#print (" NF = "NF)
for(i=1;i<=NF;i++){
if(sumItem!=i){
linAry[keyCount] = i==1 ? $i : linAry[keyCount] FS $i;
}else{
linAry[keyCount] = i==1 ? sumValueAry[keyCount] :linAry[keyCount] FS sumValueAry[keyCount];
}
}
}
# END block(s)
END {
for (i=1;i<=keyCount;i++){
print linAry[i];
}
}