【问题标题】:sum value of a 3rd row and divide rows in such a way that their sum values matches第三行的总和值,并以它们的总和值匹配的方式划分行
【发布时间】:2020-06-18 03:39:20
【问题描述】:

我有一个如下的文件,其中有 n 行,我想总计它的总和(基于第 3 列)并在 3 个不同的文件中相应地分配行(基于每个文件的总和)

例如,如果我们将所有第 3 列的值相加,则其总数为 516,如果我们将其除以 3,则为 172。

所以我想在文件中添加一行,使其不超过 172 标记,与第二个文件相同,其余所有行都应移至第三个文件。

  • 只需要确保所有 3 个文件的总和值应该匹配(小的差异就可以了)
    • 可能是它应该从顶部开始检查值并继续搜索直到最后并尝试添加尽可能多的值(只需确保总值不超过 172 标记(这是三分之一总和))
    • 它应该避免所有第三个值为 0 的行,最后将它们全部分配到所有 3 个文件中,这样它们的行数也应该接近相等。

这是除了问题-“sum value of a 3rd row and divide rows accordingly

输入文件

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

所以最终的输出是

文件1

b ab 55
c ac 17
y ae 12
a dl 34
a fk 45
m tt 9
a aa 0

文件2

l ah 56
o aj 76 
l ai 19 
h fr 17
a dy 0
q al 0
e ik 0

文件3

d pl 64
g dl 25
i dd 23
j we 27
k rt 35
f ll 0
l yt 0

来自 cmets 的 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

【问题讨论】:

  • @TrueEntertainer,请您像上次在上一篇文章中显示的那样添加您的努力,将它们添加到您的问题中,您会看到有人帮助您。
  • @RavinderSingh13- 我脑子里有逻辑,但不确定语法如何实现,因为我是 linux 的初学者。逻辑喜欢-它应该从顶部开始检查值并继续搜索直到最后并尝试添加尽可能多的值(只需确保总值不超过 172 标记(占总数的三分之一) sum)) - 它应该避免所有第三个值为 0 的行,最后将它们全部分配到所有 3 个文件中,这样它们的行数也应该接近相等。
  • @TrueEntertainer,当然,请在您的问题中添加所有这些提到的努力/细节,谢谢。
  • @ravinderSingh13- 我试过了,但没有得到如何把它放在一个循环中的语法。
  • 我把代码给了,它不再是我的了……但是这个@TrueEntertainer 应该自己写一些代码,不要再做“我不知道如何……”。我知道这不是一个简单的问题,但不努力尝试编写解决方案,不应该紧随其后给出解决方案!所以 TrueEntertainer,试着用一些代码来娱乐我们吧!

标签: shell awk sed


【解决方案1】:

您可以遵循以下几种情况:

场景 1)

  1. 读取值并将它们添加到 file1,只要总数低于所需的总数

  2. 如果 file1 的值接近所需总数,则将值添加到 file2,直到所需总数

  3. 如果 file2 的值接近所需的总数,则开始将其余部分添加到 file3。

这将为您提供如下结果:

file1、file2 和 file 3 的总数分别为:163、153、200

这可能无法满足需求,所以,

场景 2)

  1. 我们先按降序排列,然后按照场景 1 排序?

我们最终得到:

哇,这更不令人满意!我什至不会计算总数!

现在由 OP TrueEntertainer 来考虑另一种情况,三个表的填充更均匀。

应该真的比上面2个场景更难找到更好的方法!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多