用户拆分大文件

时间:2014-12-26 22:36:22

标签: python bash shell split large-files

我有一个大文件(3 * 10 ^ 7行)的呼叫详细记录(CDR),有9列(" |"作为分隔符)。每行都是具有以下属性的通信实例:

Date|Time|Duration|Caller|Receiver|serviceType|junk|cellReceiver|cellCaller|CallerLAC

我需要根据用户将此文件拆分为较小的块。因此,无论用户是呼叫者还是接收者,每个文件都将是用户的所有通信(即,如果A称为B,则该行应出现在两个文件中,即用户A的文件和用户B的文件)。

最有效的方法是什么? (我正在使用OS X Yosemite)。

2 个答案:

答案 0 :(得分:2)

bash和awk - 我知道你在标题中要求python。除非这是家庭作业,否则就足够了。

awk -F '|' {u1=$4 
            u2=$5
            arr[u1]=arr[u1] $0 "\n"
            if( u2==u1 ) continue;
            arr[u2]=arr[u2] $0 "\n"
           }
           END {
               for (i in arr) {fname=i
                               print arr[i] > fname
                               close(fname)
                              }
           } ' inputfile

一些命名变量用于使其更具可读性。您的数据有可能在所有输出文件中产生超过3000万行。我同意数据库建议。请务必检查ulimit是否允许使用内存,这将使用很多。请记住在文件系统上查看文件inode限制。

答案 1 :(得分:1)

它绝对必须是单独的文件吗?

由于您没有使用特定语言标记: 就个人而言,我将它作为管道分隔(' |')ASCII导入到SQL数据库中(假设ASCII未指明,则为ASCII)。
优点:

  1. 解析不是你的问题
  2. 您可以随意输出
  3. 以任何您想要的方式查询数据
  4. 复杂查询是可能的,无需编写比简单的SQL SELECT语句更复杂的代码
  5. 几乎所有数据库或平台都支持的方法