【发布时间】: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,试着用一些代码来娱乐我们吧!