我需要从某个命令的输出中计算第二列中的值。然而,挑战是我只需要考虑包含特定模式的行之后的那些行。例如:
命令的输出(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 已经更新了他们的答案:)