Группа и сумма в сценарии оболочки без awk

С GNU [11560]xargs[11561]:

будет работать до 4 [11562]./pgm[11563]s параллельно.

В противном случае, с [11564]pdksh[11565]/[11566]mksh[11567]/[11568]oksh[11569]:

  1. подробности обработки сигналов варьируются от одной оболочки к другой. Этот трюк работает в [11570]pdksh[11571] и его производных, но не в любой другой оболочке, которую я пробовал. Вам нужна оболочка, в которой можно поймать SIGCHLD (исключая [11572]bash[11573]), где обработчик SIGCHLD выполняется сразу (не блокируется во время ожидания [11574]wait[11575]) (исключает [11576]ash[11577],

  2. yash

  3. ), где обработка сигнала SIGCHLD прерывает ожидание [11580]wait[11581] (исключает [11582]ksh93[11583] и [11584]zsh[11585]).

В оболочках, кроме [11586]bash[11587], можно также посмотреть на подходы, где задания начинаются в обработчике SIGCHLD.

.

1
11.02.2015, 09:02
3 ответа

Я думаю, что это сделаю:

awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{ for (i in a) print i,a[i]}'
3
27.01.2020, 23:13

Чистый bash, один лайнер:

unset x y sum; while IFS=, read x y; do ((sum[$x]+=y)); done <  input.csv; for i in ${!sum[@]}; do echo $i,${sum[$i]}; done

Или в более читабельном виде:

unset x y sum
while IFS=, read x y; do
    ((sum[$x]+=y)); done < input.csv
for i in ${!sum[@]}; do
    echo $i,${sum[$i]}
done

Результат:

100,400
201,400
300,600
3
27.01.2020, 23:13

С помощью питона это можно сделать более эффективно. Эта программа по умолчанию ожидает, что файл будет назван 'file.txt', который при необходимости можно изменить.

#!/usr/bin/env python3

col1, col2 = [ list(y) for y in zip(*[ x.strip().split(',') for x in open('file.txt').readlines() if x != '\n' ]) ]

for (offset,x) in enumerate(list(col1)):
    value = 0
    while col1.count(x) > 1:
        index = col1.index(x)
        col1.pop(index)
        value =  int(col2.pop(index))

        index = col1.index(x)
        col2[index] = int(col2[index]) + value

for x, y in zip(col1, col2):
    print(x,',',y)

Вывод:

201 , 400
300 , 600
100 , 400
1
27.01.2020, 23:13

Теги

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