对列中的值进行计数,但仅考虑匹配模式第一次出现后的行

对列中的值进行计数,但仅考虑匹配模式第一次出现后的行

我需要从某个命令的输出中计算第二列中的值。然而,挑战是我只需要考虑包含特定模式的行之后的那些行。例如:
命令的输出(ptree)-

第1234章
   第3342章 /bin/用户/123/loc
      7783 sup
         1234ABCAAA1 BBB1 CCC1 D444
         0909ABCxx11 SD11 lk23 3484
         8383当前uh9u 38tt kj33 SD99
         3030兹兹qq11 11ii 39ii ij33
         0101超级kk88 sis8 88si mm92
         1020zz098df cv99 儿童 8dhd
         1111超级9ike 39ei 93je 39de

我需要找到第一次出现的sup(位于第三行),并希望计算第三行之后第二列(粗体标记)中的所有值(将相似的值分组)。第一次出现 'sup' 之前的行数不是固定的,它可能会随时变化(所以不能将其硬编码为 3)。

输出应该是这样的 -

abc 2  
cur 1  
zzz 1  
sup 2  
zz0 1  

有人可以建议执行此操作的最佳方法吗?

答案1

尝试这个,

 sed -e '1,/sup/d;/^[0-9]/,$d' file.txt | awk 'NF>=3{ a[$2]++ } END { for (n in a) print n, a[n] }'
  • 1,/sup/d将删除之前的所有内容sup
  • /^[0-9]/,$d如果有任何其他进程尾随,将删除sup

答案2

您可以在记录第一次匹配时设置“处理开关” sup,并且仅在设置了开关时才计数:

$ gawk '
    /sup/ {p=1} 
    p {a[$2]++} 
    END {
      PROCINFO["sorted_in"] = "@ind_str_asc"; 
      for (i in a) print i, a[i]
    }' file
abc 2
cur 1
sup 3
zz0 1
zzz 1

如果您的 Awk 不支持PROCINFO数组遍历功能,您可以通过外部管道输出sort

答案3

与@msp9011非常相似

$ sed -n '/sup/,$p' input.txt|awk 'NR>1 {counts[$2]++} END  { for(key in counts) print key, counts[key] }'

sed打印从第一行到sup文件末尾的所有行。awk从传递给它的第二行开始计数,第二列中的所有不同值。最后它打印出结果。

编辑:正如 @msp9011 提到的,这假设之后没有更多进程。要找到此过程,这里有一个更新版本:

$ sed -n '/sup$/,/^[0-9]/p' count.txt|sed -e '1d' -e '$d'|awk '{counts[$2]++} END  { for(key in counts) print key, counts[key] }'

sed打印从以数字结尾的行sup到以数字开头的行的所有内容。然后第一行和最后一行被删除并awk开始计数。

EDIT2:@msp9011 已经更新了他们的答案:)

相关内容