gpt4 book ai didi

bash - 如何在 bash 一行中聚合计数

转载 作者:行者123 更新时间:2023-11-29 09:01:29 25 4
gpt4 key购买 nike

我经常使用sort | uniq -c 进行计数统计。现在,如果我有两个具有此类计数统计信息的文件,我想将它们放在一起并添加计数。 (我知道我可以附加原始文件并在那里计数,但让我们假设只有计数文件是可访问的)。

例如给定:

a.cnt:

   1 a
2 c

b.cnt:

   2 b
1 c

我想连接并获得以下输出:

   1 a
2 b
3 c

在 shell 中执行此操作的最短方法是什么?

编辑:

感谢您到目前为止的回答!

一些可能需要额外考虑的方面:

  • 如果 a、b、c 是任意字符串,包含任意空格怎么办?
  • 如果文件太大,内存放不下怎么办?有没有一些 sort | uniq -c 这种情况下一次只查看两行的样式命令行选项?

最佳答案

这适用于任何给定数量的文件:

$ cat a.cnt b.cnt | awk '{a[$2]+=$1} END{for (i in a) print a[i],i}'
1 a
2 b
3 c

因此,假设您有 10 个文件,您只需执行 cat f1 f2 ... 然后通过管道传输此 awk

如果文件名碰巧共享一个模式,你也可以这样做(thanks Adrian Frühwirth!):

awk '{a[$2]+=$1} END{for (i in a) print a[i],i}' *cnt

例如,这将考虑扩展名为 cnt 的所有文件。


Some possible side-aspects one might want to consider additionally:

  • what if a, b, c are arbritrary strings, containing arbitrary white-spaces?
  • what if the files are too big to fit in memory? Is there some sort | uniq -c-style command line option for this case that only looks at two lines at a time?

在这种情况下,您可以使用其余列作为计数器的索引:

awk '{count=$1; $1=""; a[$0]+=count} END{for (i in a) print a[i],i}' *cnt

请注意,实际上您不需要sort | uniq -c 并重定向到 cnt 文件,然后执行重新计数。你可以用这样的东西一起做这一切:

awk '{a[$0]++} END{for (i in a) print a[i], i}' file

例子

$ cat a.cnt
1 and some
2 text here

$ cat b.cnt
4 and some
4 and other things
2 text here
9 blabla

$ cat *cnt | awk '{count=$1; $1=""; a[$0]+=count} END{for (i in a) print a[i],i}'
4 text here
9 blabla
4 and some
4 and other things

关于第二条评论:

$ cat b
and some
text here
and some
and other things
text here
blabla

$ awk '{a[$0]++} END{for (i in a) print a[i], i}' b
2 and some
2 text here
1 and other things
1 blabla

关于bash - 如何在 bash 一行中聚合计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22383981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com