Скрипт Awk для суммирования нескольких столбцов, если значение в column1 является повторяющимся - PullRequest
0 голосов
/ 04 мая 2018

Нужна ваша помощь, чтобы решить вопрос ниже. Я хочу суммировать значения для column3, column5, column6, column7, column9, column10, если значение в column1 является повторяющимся. Также необходимо сделать повторяющиеся строки как одну строку в выходном файле, а также поместить значение 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

1 Ответ

0 голосов
/ 04 мая 2018
$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...