【问题标题】:AWK: Ignore lines grouped by an unique value conditioned on occurrences of a specific field valueAWK:忽略按特定字段值出现的唯一值分组的行
【发布时间】:2015-03-26 11:00:59
【问题描述】:

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

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

具体来说,有输入

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 , 对应于 222444 的行将被忽略。"

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

【问题讨论】:

    标签: awk split pattern-matching conditional-statements find-occurrences


    【解决方案1】:

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

    $ 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
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2020-08-21
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多