0

如有需要,请帮忙修改标题和帖子,谢谢。

简而言之,我想首先在第一个字段中对具有唯一值的行进行分组,并在基础行组中的另一个字段中累积特定值的出现。如果出现的总和不满足自定义阈值,则应忽略组中的行。

具体来说,输入

111,1,P,1
111,1,P,1
111,1,P,0
111,1,M,1
222,1,M,1
222,1,M,0
333,1,P,0
333,1,P,1
444,1,M,1
444,1,M,1
444,0,M,0
555,1,P,1
666,1,P,0

所需的输出应该是

111,1,P,1
111,1,P,1
111,1,P,0
111,1,M,1
333,1,P,0
333,1,P,1
555,1,P,1
666,1,P,0

意思是“因为第一个字段中的唯一值并且在第三个字段222444没有至少一个(可以是任何所需的阈值) ,因此忽略P对应于222和的行。”444

此外,这应该在不编辑原始文件的情况下完成,并且必须结合已解决的问题Split CSV to Multiple Files Containing a Set Number of Unique Field Values。通过这样做,生成的拆分文件中不会涉及几行。

4

1 回答 1

0

我相信这个单线可以满足您的要求:

$ awk -F, '{a[$1,++c[$1]]=$0}$3=="P"{p[$1]}END{for(i in c)if(i in p)for(j=1;j<=c[i];++j)print a[i,j]}' file
111,1,P,1
111,1,P,1
111,1,P,0
111,1,M,1
333,1,P,0
333,1,P,1
555,1,P,1
666,1,P,0

Array a,跟踪文件中的所有行,按第一个字段和c我们稍后使用的计数对它们进行分组。如果第三个字段包含 P,则在p数组中设置一个键。

处理完整个文件后,遍历第一个字段的所有值。如果已p为该值设置了键,则从 打印行a

您在问题中提到了阈值数量的条目。如果这样,您的意思是必须N出现“P”才能打印行,您可以更改{p[$1]}{++p[$1]},然后在块中更改if(i in p)为。if(p[i]>=N)END

于 2015-03-26T11:10:58.660 回答