AWK:忽略以特定字段值的出现为条件的唯一值分组的行

AWK: Ignore lines grouped by an unique value conditioned on occurrences of a specific field value

如果需要,请帮助修改标题和post,谢谢。

简而言之,我想首先对第一个字段中具有唯一值的行进行分组,然后在基础行组的另一个字段中累积特定值的出现次数。如果出现次数的总和不符合 self-defined 阈值,则应忽略组中的行。

具体来说,输入

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

意思是"because the unique values in the first field 222 and 444 don't have at least one (which can be any desired threshold) P in the third field, lines corresponding to 222 and 444 are ignored."

此外,这应该在不编辑原始文件的情况下完成,并且必须结合已解决的问题。这样,分割后的文件中就不会涉及到几行了。

我相信这条线可以满足您的需求:

$ awk -F, '{a[,++c[]]=[=10=]}=="P"{p[]}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

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

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

的行

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