У меня есть файл, как показано ниже, с количеством строк n, я хочу суммировать его сумму (на основе 3-го столбца) и соответственно распределить строки в 3 разных файлах (на основе суммы каждого)
Например - если мы просуммируем все значения 3-го столбца, получится 516, а если мы разделим его на 3, получится 172.
Итак, я хочу добавить строки в файл, чтобы он не превышал 172 балла , то же самое со вторым файлом, а остальные строки должны переместиться в третий файл.
- Просто убедитесь, что сумма всех 3 файлов должна совпадать (небольшая разница в порядке)
- может быть, следует начать проверку значений сверху и продолжить поиск до конца и попытаться добавить как можно больше (просто убедитесь, что общее значение не превышает отметку 172 (что составляет одну треть от общая сумма))
- Следует избегать всех строк, для которых третье значение равно 0, и, наконец, распределить их все по всем 3 файлам таким образом, чтобы их количество строк также было примерно одинаковым.
Это дополнение к вопросу - « суммируйте значение третьей строки и разделите строки соответственно »
Входной файл
a aa 0
b ab 55
c ac 17
a dy 0
y ae 12
a dl 34
a fk 45
l ah 56
o aj 76
l ai 19
q al 0
d pl 64
e ik 0
f ll 0
g dl 25
h fr 17
i dd 23
j we 27
k rt 25
l yt 0
m tt 19
ожидаемый результат
файл1 Итого (172)
b ab 55
c ac 17
y ae 12
a dl 34
a fk 45
m tt 9
файл2 Итого (168)
l ah 56
o aj 76
l ai 19
h fr 17
файл3 Итого (174)
d pl 64
g dl 25
i dd 23
j we 27
k rt 35
Позже он должен проверить наличие всего столбца 0 и разделить его таким образом, чтобы общее количество строк каждого файла также можно было немного сбалансировать.
a aa 0
a dy 0
q al 0
e ik 0
f ll 0
l yt 0
, поэтому окончательный результат будет
file1
b ab 55
c ac 17
y ae 12
a dl 34
a fk 45
m tt 9
a aa 0
file2
l ah 56
o aj 76
l ai 19
h fr 17
a dy 0
q al 0
e ik 0
file3
d pl 64
g dl 25
i dd 23
j we 27
k rt 35
f ll 0
l yt 0
Попытки OP из комментариев:
awk '{ L[nr++]=$0; sum+=$3 } END{ sumpf=sum/3; sum=0; file=1; for(i in L) { split(L[i],a); if ((sum+a[3])>sumpf && file<3) { file+=1; sum=0; }; print i, L[i] > "file" file; sum+=a[3]; } }' input