将文件中的所有值相加

将文件中的所有值相加

我有一份长达 313,000 行的日志,如下所示。我试图找到一种快速将所有在线玩家加起来的方法:(数字)/100。所以基本上就是把所有的 (数字) 加在一起。

数据示例:

[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 19/100 Total chunks loaded: 8413 Total entities: 1532

Java 日志

答案1

听起来像是 awk 的工作!假设格式比较稳定,则以下 awk 脚本应该可以完成这项工作:

$ cat t1
[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 20/100 Total chunks loaded: 8413 Total entities: 1532
[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 20/100 Total chunks loaded: 8413 Total entities: 1532
[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 20/100 Total chunks loaded: 8413 Total entities: 1532
[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 20/100 Total chunks loaded: 8413 Total entities: 1532
[04-28-2018 22:49:30] TPS: 20.0 Memory free: 2394.0/4551.0 (52%) Players online: 20/100 Total chunks loaded: 8413 Total entities: 1532

$ awk '{po=$11; split(po,a,"/"); sum+=a[1]} END {print sum}' t1
100

基本上步骤如下:

1) 将每行的位置 11 分配给变量 po 2) 根据 / 字符拆分 po 并将各部分分配给数组 a 3) 将数组 a 的第一个元素添加到运行总和变量 4) 读取所有数据后,END 匹配,打印运行总和

如果文件中还有其他数据,您可以告诉 awk 仅处理与特定模式匹配的行,例如:

$ awk '/TPS:/ {po=$11; split(po,a,"/"); sum+=a[1]} END {print sum}' t1

Awk 在 Mac 和 Linux 上默认安装,在 Windows 上可以免费下载。请参阅:https://stackoverflow.com/q/21927944/988525或者快速谷歌搜索。Cygwin 或新的 Windows Linux 子系统需要更多工作才能设置,但会打开一个可用于解决此类问题的精彩工具世界。

答案2

如果这是一个一次性的问题,并且不需要编写脚本,您也可以将文件加载到您最喜欢的电子表格程序中,并使用文本到列来拆分数据。目标是最终将在线玩家放在一列中,当然可以将其加起来。更手动,但如果数据很乱,而且是一次性的事情,这可能是一种有用的方法来清理数据以供分析。

相关内容