2013-12-17 48 views
0

我有两个文本文件,映射IDS 10万条记录

文件1与数据,如

用户游戏计数

A Rugby 2 
A Football 2 
B Volleyball 1 
C TT 2 
... 

文件2

1 Basketball 
2 Football 
3 Rugby 
... 
90 TT 
91 Volleyball 
... 

现在我想要做的就是在File 2中添加另一列,以便将文件2中的游戏的相应索引作为额外的列UMN在文件1.

我在文件1.2万个条目所以我想从文件2.如何有效地做到这一点另一列添加指定的游戏指数(基本上是行号或订单)。

现在我正在逐行进行这项工作。从文件读取1行,用grep从文件2对应的游戏其行号和保存/编写到一个文件中。

这将需要我很多年。如果我在文件2中有1000万行,在文件1中有3000行,我该如何加快速度?

+0

有没有你不使用该数据库中的任何原因? –

+0

不,没有理由。我以文本文件的形式存在。 – user34790

+1

你已经问过了同样的问题 - http://stackoverflow.com/q/20602644/45375 - 并获得答案。如果这些不起作用,请修改您的问题和/或开始赏金。 – mklement0

回答

1

随着,读取字段1从File2到由场2索引的数组,从File1查找使用字段2数组作为你遍历它

awk 'NR == FNR{a[$2]=$1; next}; {print $0, a[$2]}' File2 File1 
A Rugby 2 3 
A Football 2 2 
B Volleyball 1 91 
C TT 2 90 
+0

这会占用10M行多少时间? –

+0

@BenjaminGruenbaum,我还没有测量它,但它可能比OP的grep循环快很多。核心部分,数组查找,是'O(1)' – iruvar

+0

@BenjaminGruenbaum大概比读取每个文件稍长一点,再加上打印匹配的一些开销。如果只有少数匹配,则没有太多开销。 – tripleee

0

使用join命令:

$ cat file1 
A Rugby 2 
A Football 2 
B Volleyball 1 
C TT 2 

$ cat file2 
1 Basketball 
2 Football 
3 Rugby 
90 TT 
91 Volleyball 

$ join -1 3 -2 1 -o 1.1,1.2,1.3,2.2 \ 
     <(sort -k 3 file1) <(sort -k 1 file2) 

B Volleyball 1 Basketball 
A Football 2 Football 
A Rugby 2 Football 
C TT 2 Football 
0

这里的另一种方法:只读小文件到内存,然后逐行读取较大的文件。一旦每个ID已经发现,摆脱困境:

awk ' 
    NR == FNR { 
     f1[$2] = $0 
     n++ 
     next 
    } 
    ($2 in f1) { 
     print f1[$2], $1 
     delete f1[$2] 
     if (--n == 0) exit 
    } 
' file1 file2 

重读你的问题,我不知道如果我回答了这个问题:你想一个额外的列追加到文件1或文件2?