为了账号安全,请及时绑定邮箱和手机立即绑定

AWK脚本,如果column1中的值重复,则求和多列

AWK脚本,如果column1中的值重复,则求和多列

慕莱坞森 2021-04-09 14:15:40
需要您的帮助来解决以下查询。我想总结column3,column5,column6,column7,column9,column10的值(如果column1中的值重复)。还需要在输出文件中将重复的行作为单行,并且还需要将column1的值放在输出文件的第8列中输入文件a|b|c|d|e|f|g|h|i|jIN27201800024099|a|2.01|ad|5|56|6|rr|1|5IN27201800023963|b|3|4|rt|67|6|61|ty|6IN27201800024099|a|4|87|ad|5|6|1|rr|7.45IN27201800024099|a|5|98|ad|5|6|1|rr|8IN27201800023963|b|7|7|rt|5|5|1|ty|56IN27201800024098|f|80|67|ty|6|6|1|4rght|765输出文件a|b|c|d|e|f|g|h|i|j|kIN27201800024099|a|11.01|190|ad|66|18|3|rr|20.45|IN27201800024099IN27201800023963|b|10|11|rt|72|11|62|ty|62|IN27201800023963IN27201800024098|f|80|67|ty|6|6|1|4rght|765|IN27201800024098在下面的代码中尝试过,但是它不起作用,也不知道如何完成代码以获取正确的输出awk 'BEGIN {FS=OFS="|"} FNR==1 {a[$1]+= (f3[key]+=$3;f5[key]+=$5;f6[key]+=$6;f7[key]+=$7;f9[key]+=$9;f10[key]+=$10;)} input.txt > output.txt
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

$ cat tst.awk

BEGIN {

    FS=OFS="|"

}

NR==1 {

    print $0, "h"

    next

}

{

    keys[$1]

    for (i=2; i<=NF; i++) {

        sum[$1,i] += $i

    }

}

END {

    for (key in keys) {

        printf "%s", key

        for (i=2; i<=NF; i++) {

            printf "%s%s", OFS, sum[key,i]

        }

        print OFS key

    }

}


$ awk -f tst.awk file

a|b|c|d|e|f|g|h

IN27201800023963|10|11|72|11|62|62|IN27201800023963

IN27201800024098|80|67|6|0|1|765|IN27201800024098

IN27201800024099|11.01|190|66|18|3|20.45|IN27201800024099

上面的代码以随机顺序输出行,如果您希望它们以与读入键值相同的顺序输出,那只是几行代码:


$ cat tst.awk

BEGIN {

    FS=OFS="|"

}

NR==1 {

    print $0, "h"

    next

}

!seen[$1]++ {

    keys[++numKeys] = $1

}

{

    for (i=2; i<=NF; i++) {

        sum[$1,i] += $i

    }

}

END {

    for (keyNr=1; keyNr<=numKeys; keyNr++) {

        key = keys[keyNr]

        printf "%s", key

        for (i=2; i<=NF; i++) {

            printf "%s%s", OFS, sum[key,i]

        }

        print OFS key

    }

}


$ awk -f tst.awk file

a|b|c|d|e|f|g|h

IN27201800024099|11.01|190|66|18|3|20.45|IN27201800024099

IN27201800023963|10|11|72|11|62|62|IN27201800023963

IN27201800024098|80|67|6|0|1|765|IN27201800024098


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 316 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信