首页 文章

如何获取大型文本文件的统计信息

提问于
浏览
1

我有一个大型(~100,000,000行)文本文件的集合,格式如下:

0.088293 1.3218e-32 2.886e-07 2.378e-02        21617        28702
    0.111662 1.1543e-32 3.649e-07 1.942e-02        93804        95906
    0.137970 1.2489e-32 4.509e-07 1.917e-02        89732        99938
    0.149389 8.0725e-32 4.882e-07 2.039e-02        71615        69733
    ...

我想找到第2列的平均值和总和以及第3列和第4列的最大值和最小值,以及总行数 . 如何使用NumPy有效地完成此操作?由于它们的大小, loadtxtgenfromtxt 并不好(需要很长时间才能执行)因为它们试图将整个文件读入内存 . 相比之下,像 awk 这样的Unix工具:

awk '{ total += $2 } END { print total/NR }' <filename>

在合理的时间内工作 . Python / NumPy可以为这些大文件完成 awk 的工作吗?

2 回答

  • -1

    遍历这些行并应用正则表达式来提取您要查找的数据,将其添加到您想要的每列的最初空列表中 .

    一旦列表中的列,您可以将max(list)min(list)avg(list)函数应用于数据,以获得您感兴趣的任何计算 .

    注意:您可能需要修改将数据添加到列表中的位置,并将数字从str转换为int形式,以便max,min,avg函数可以对它们进行操作 .

  • 2

    你可以这样说:

    awk '{  total2 += $2
            for (i=2;i<=3;i++) {
                max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i
                min[i]=(length(min[i]) && min[i]<$i)?min[i]:$i
            }
         } END {
               print "items", "average2", "min2", "min3", "max2", "max3"
               print NR, total2/NR, min[2], min[3], max[2], max[3]
         }' file
    

    测试

    根据您的输入:

    $ awk '{total2 += $2; for (i=2;i<=3;i++) {max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i; min[i]=((length(min[i]) && min[i]<$i)?min[i]:$i)}} END {print "items", "average2", "min2", "min3", "max2", "max3"; print NR, total2/NR, min[2], min[3], max[2], max[3]}' a | column -t
    items  average2     min2        min3       max2        max3
    4      2.94938e-32  1.1543e-32  2.886e-07  8.0725e-32  4.882e-07
    

相关问题