Сумма 2-го и 3-го столбца для одного значения в 1-м столбце - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу суммировать значение во 2-м и 3-м столбцах для того же значения в 1-м столбце

1555971000 6 1   
1555971000 0 2  
1555971300 2 0  
1555971300 3 0 

Вывод будет выглядеть как

1555971000 6 3  
1555971300 5 0 

Я пробовал команду ниже

awk -F" " '{b[$2]+=$1} END { for (i in b) { print b[i],i } } '

но, похоже, это только для одного столбца.

Ответы [ 5 ]

1 голос
/ 23 апреля 2019

если данные в 'd' без сортировки, попробуйте gnu awk,

awk 'BEGIN{f=1} {if($1==a||f){b+=$2;c+=$3;f=0} else{print a,b,c;b=$2;c=$3} a=$1} END{print a,b,c}' d

с сортировкой gnu awk

awk '{w[NR]=$0} END{asort(w);f=1;for(;i++<NR;){split(w[i],v);if(v[1]==a||f){f=0;b+=v[2];c+=v[3]} else{print a,b,c;b=v[2];c=v[3];} a=v[1]} print a,b,c;}' d
1 голос
/ 23 апреля 2019

Вот еще один способ с чтением Input_file 2 раза, и он будет обеспечивать вывод в той же последовательности, что и последовательность Input_file.

awk 'FNR==NR{a[$1]+=$2;b[$1]+=$3;next} ($1 in a){print $1,a[$1],b[$1];delete a[$1]}' Input_file Input_file
0 голосов
/ 23 апреля 2019

Предполагая, что когда вы написали:

awk -F" " '{b[$2]+=$1} END { for (i in b) { print b[i],i } } '

вы хотели написать:

awk '{ b[$1]+=$2 } END{ for (i in b) print i,b[i] }'

Это не должно быть огромным скачком, чтобы понять:

$ awk '{ b[$1]+=$2; c[$1]+=$3 } END{ for (i in b) print i,b[i],c[i] }' file
1555971000 6 3
1555971300 5 0

Пожалуйста, получите книгу Арнольда Роббинса "Эффективное программирование Awk", 4-е издание, и просто прочитайте параграф или 2 о полях и массивах.

0 голосов
/ 23 апреля 2019

Другой awk, который будет работать независимо от порядка записей независимо от того, отсортированы они или нет:

awk '{r[$1]++}
     r[$1]==1{o[++c]=$1}
     {f[$1]+=$2;s[$1]+=$3}
     END{for(i=1;i<=c;i++){print o[i],f[o[i]],s[o[i]]}}' file
0 голосов
/ 23 апреля 2019

Вы можете сделать это с помощью awk, сначала сохранив поля в первой записи, а затем для всех последующих записей, сравнив, совпадает ли первое поле, если да, добавьте содержимое полей два и три и продолжите. Если первое поле не соответствует, выведите свое первое поле и текущие суммы, например,

awk '{ 
    if ($1 == a) { 
        b+=$2; c+=$3; 
    }
    else {
        print a, b, c; a=$1; b=$2; c=$3;
    }
} END { print a, b, c; }' file

С помощью ввода в file вы можете скопировать и вставить вышеизложенное в свой терминал и получить следующее:

Пример использования / вывода

$ awk '{
>     if ($1 == a) {
>         b+=$2; c+=$3;
>     }
>     else {
>         print a, b, c; a=$1; b=$2; c=$3;
>     }
> } END { print a, b, c; }' file

1555971000 6 3
1555971300 5 0

Использование awk Массивы

Более короткая и краткая альтернатива с использованием массивов, которая не требует, чтобы ваш ввод был отсортирован в следующем порядке:

awk '{a[$1]+=$2; b[$1]+=$3} END{ for (i in a) print i, a[i], b[i] }' file

(тот же вывод)

Использование массивов позволяет одинаково хорошо суммировать столбцы для одинакового поля1, если ваш файл данных содержал следующие строки в случайном порядке, например,

1555971300 2 0
1555971000 0 2
1555971000 6 1
1555971300 3 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...