【问题标题】:Awk script to sum multiple column if value in column1 is duplicate如果 column1 中的值重复,则 Awk 脚本对多列求和
【发布时间】:2018-05-04 13:57:50
【问题描述】:

需要您的帮助来解决以下查询。 如果 column1 中的值重复,我想总结 column3、column5、column6、column7、column9、column10 的值。 还需要在输出文件中将重复的行作为单行,还需要将column1的值放在输出文件的第8列中

输入文件

a|b|c|d|e|f|g|h|i|j
IN27201800024099|a|2.01|ad|5|56|6|rr|1|5
IN27201800023963|b|3|4|rt|67|6|61|ty|6
IN27201800024099|a|4|87|ad|5|6|1|rr|7.45
IN27201800024099|a|5|98|ad|5|6|1|rr|8
IN27201800023963|b|7|7|rt|5|5|1|ty|56
IN27201800024098|f|80|67|ty|6|6|1|4rght|765

输出文件

a|b|c|d|e|f|g|h|i|j|k
IN27201800024099|a|11.01|190|ad|66|18|3|rr|20.45|IN27201800024099
IN27201800023963|b|10|11|rt|72|11|62|ty|62|IN27201800023963
IN27201800024098|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

【问题讨论】:

  • 为什么不将您的脚本分散到带有空格的几行中,以使其清晰易读,而不是将其全部塞到一行中,而这只是一堆字符?

标签: linux bash awk scripting


【解决方案1】:
$ 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

【讨论】:

  • 嗨@Ed Morton ...假设我们在输入文件中有column2,column3,column4,column5,column6,columns7 作为column38,column39,column40,column42,column44 和column49 那么如何处理它(还输入文件包含大约 59 列,其中需要对列 38、39、40、42、44、49 求和)。目前在输入文件中,所有列都按从第 2 列到 coluimn7 的顺序排列。
  • 抱歉,我不知道您在评论中要问什么。由于chameleon questions 通常不鼓励使用,而我回答了the question you asked,请参阅stackoverflow.com/help/someone-answers 了解下一步该做什么,然后问一个新问题,如果你有自己的minimal reproducible example,包括简洁、可测试的样本输入和预期输出,例如你提供了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2015-10-08
  • 2014-10-29
  • 2019-03-25
相关资源
最近更新 更多