суммировать значение 3-й строки и разделить строки таким образом, чтобы их значения суммы совпадали - PullRequest
0 голосов
/ 18 июня 2020

У меня есть файл, как показано ниже, с количеством строк 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

1 Ответ

0 голосов
/ 19 июня 2020

Есть несколько сценариев, которым вы можете следовать:

Сценарий 1)

  1. Считайте значения и добавьте их в файл1, пока как, итоговое значение меньше требуемого итога

  2. Если значение файла1 близко к требуемому итоговому значению, прибавляйте значения к файлу2 до требуемого итогового значения

  3. Если значение file2 близко к требуемому. Total start добавление остатка к file3.

Это даст вам следующий результат: enter image description here

With итоговые значения соответственно для файла1, файла2 и файла 3: 163, 153, 200

Это может не удовлетворить потребности, поэтому

Сценарий 2)

  1. Что мы сначала упорядочиваем по убыванию, а затем следуем Сценарию 1?

В итоге получаем: enter image description here

Вау , это даже менее приятно! Я даже не буду считать итоги!

Теперь OP TrueEntertainer должен подумать о другом сценарии, где три таблицы будут заполнены более равномерно.

Он должен на самом деле не будет так сложно найти лучший способ, чем два вышеупомянутых сценария !!

...