Необходимо суммировать последний столбец на основе разделителя каналов

Что ж, мне помог @stevepusser с forum.debian.net :)

Уловка состоит в том, чтобы создать пакет из ppa. Официальное руководство с гораздо более подробной информацией можно найти здесь: debian / wiki / CreatePackageFromPPA

Но чтобы установить powernap, вы должны выполнить следующие шаги:

- Установите Debian SDK: apt-get install devscripts build-essential

- Добавьте URL-адрес источника PPA в свой sources.list:

  1. Найдите deb-src , выбрав «Добавление этого PPA в вашу систему»> «Технические подробности об этом PPA»
    Для powernap это https://launchpad.net/~powernap/+archive/ubuntu/ppa
  2. Добавьте источник в списки источников:
    echo "deb-src http: // ppa. launchpad.net/powernap/ppa/ubuntu utopic main "> /etc/apt/sources.list.d/powernap.list
  3. Добавьте ключи в вашу систему:
    apt-key adv --keyserver keyserver.ubuntu .com --recv-keys
  4. ВАЖНО !! Обновите свои источники:
    apt-get update
  5. Создайте папку для файлов * .deb:
    cd ~ && mkdir powernap && cd powernap
  6. Создайте свои файлы:
    apt- получить исходный код --build powernap

3
25.03.2018, 14:51
4 ответа

Awkраствор:

awk 'BEGIN{ FS=OFS="|" }
     { a[$1 FS $2 FS $3 FS $4 FS $5 FS $6] += $7 }
     END{ for (i in a) print i, a[i] }' file

Выход:

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099
5
27.01.2020, 21:07

Идея правильная, но для такого требования вы создаете хеш-ключ в качестве значений, кроме последнего столбца, и используете этот ключ для суммирования значений в последнем столбце. После обработки всех строк в предложении ENDмы печатаем суммированные значения

awk '
     BEGIN {FS=OFS="|"} {
         hashKey = ""
         for(i=1;i<=(NF-1); i++) {
             hashKey = ( hashKey ? (hashKey FS $i):$i )
         }
         total[hashKey]+=$NF
     }
     END { for ( j in total ) print j, total[j] }
' file
4
27.01.2020, 21:07

С помощью команды GNUdatamash:

$ datamash -t'|' -s -g 1,2,3,4,5,6 sum 7 < infile
11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|8409

Вdatamash v1.2+вы также можете указать диапазон столбцов.

$ datamash -t'|' -s -g 1-6 sum 7 < infile

Или самая короткаяAWKальтернатива, и где у вас было N столбцов, и вы не должны указывать все один за другим:

awk -F'|' '{x=$NF;NF--; a[$0]+=x} END{for(i in a) print i, a[i]}' OFS='|' infile
9
27.01.2020, 21:07

и перл

perl -lne '
    $sum{$1} += $2 if /(.*)\|(.*)/
 } END {
    print "$_|$sum{$_}" for keys %sum
' file
0
27.01.2020, 21:07

Теги

Похожие вопросы