映射id为1000万条记录

时间:2013-12-17 22:37:18

标签: bash shell

我有两个文本文件,

文件1包含

等数据

用户游戏次数

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

文件2

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

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

我在文件1中有200万个条目。所以我想添加另一个列,指定文件2中游戏的索引(基本上是行号或顺序)。如何有效地执行此操作。

现在我逐行做这个。从文件1中读取一行,从文件2中获取相应的游戏,获取其行号并将其保存/写入文件。

这将花费我很多年。如果文件2中有1000万行,文件1中有3000行,我怎样才能加快速度?

4 个答案:

答案 0 :(得分:1)

使用,将File2中的字段1读入由字段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

答案 1 :(得分:0)

您可以从第二个文件构造一个关联数组,游戏名称为键,游戏索引为值。然后对于文件1中的每一行,在数组中搜索想要的id,并将其写回

Associative arrays provide O(1) time complexity.

答案 2 :(得分: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

答案 3 :(得分: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 

重读你的问题,我不知道我是否回答了这个问题:你想要在file1或file2附加一个额外的列吗?