AWK:根据特定字段值的出现情况,忽略按唯一值分组的行

AWK:根据特定字段值的出现情况,忽略按唯一值分组的行,awk,split,pattern-matching,conditional-statements,find-occurrences,Awk,Split,Pattern Matching,Conditional Statements,Find Occurrences,如果需要,请帮助修改标题和帖子,谢谢 简言之,我希望首先在第一个字段中使用唯一值对行进行分组,然后在基础行组的另一个字段中累积特定值的出现次数。如果出现次数的总和不符合自定义阈值,则应忽略组中的行 具体来说,有了投入 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 所需的输出应为 11

如果需要,请帮助修改标题和帖子,谢谢

简言之,我希望首先在第一个字段中使用唯一值对行进行分组,然后在基础行组的另一个字段中累积特定值的出现次数。如果出现次数的总和不符合自定义阈值,则应忽略组中的行

具体来说,有了投入

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
这意味着“由于第一个字段
222
444
中的唯一值在第三个字段中没有至少一个(可以是任何期望的阈值)
p
,因此忽略与
222
444
对应的行。”


此外,这应该在不编辑原始文件的情况下完成,并且必须与已解决的问题相结合。通过这样做,结果分割文件中将不会涉及几行内容。

我相信这一行内容满足了您的要求:

$ 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
$awk-F,'{a[$1,++c[$1]]=$0}$3==“P”{P[$1]}END{for(i in c)如果(i in P)for(j=1;j