будет работать до 4 [11562]./pgm[11563]s параллельно.
В противном случае, с [11564]pdksh[11565]/[11566]mksh[11567]/[11568]oksh[11569]:
подробности обработки сигналов варьируются от одной оболочки к другой. Этот трюк работает в [11570]pdksh[11571] и его производных, но не в любой другой оболочке, которую я пробовал. Вам нужна оболочка, в которой можно поймать SIGCHLD (исключая [11572]bash[11573]), где обработчик SIGCHLD выполняется сразу (не блокируется во время ожидания [11574]wait[11575]) (исключает [11576]ash[11577],
yash
), где обработка сигнала SIGCHLD прерывает ожидание [11580]wait[11581] (исключает [11582]ksh93[11583] и [11584]zsh[11585]).
В оболочках, кроме [11586]bash[11587], можно также посмотреть на подходы, где задания начинаются в обработчике SIGCHLD.
.
Я думаю, что это сделаю:
awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{ for (i in a) print i,a[i]}'
Чистый 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
С помощью питона
это можно сделать более эффективно. Эта программа по умолчанию ожидает, что файл будет назван '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