2015-11-02 29 views
1

所以我有两个文件。 File AFile BFile A巨大(> 60 GB),并有16行,数字和字符串的混合,由“|”分隔,并有超过600,000,000行。字段3在这个文件中是ID,它是一个数字字段,长度不同(例如,某人的ID可以是1,而其他人的ID可以是100)加入unix当字段是数字在一个巨大的文件

File B只有一堆ID(〜1,000,000)和我想提取File A中具有“文件B”中ID的所有行。我已经开始做这个使用Linux下面的代码

sort -k3,3 -t'|' FileA.txt > FileASorted.txt 
sort -k1,1 -t'|' FileB.txt > FileBSorted.txt 

join -1 3 -2 1 -t'|' FileASorted.txt FileBSorted.txt > merged.txt 

我的问题是,merged.txt是空的(当我知道一个事实,至少有10场比赛)。我用Google搜索这一点,它似乎问题是连接字段(ID)是数字。有些人提出用零填充该领域,但1)我不完全确定如何做到这一点,2)这似乎非常缓慢/时间效率低下。

有没有其他想法呢?或帮助如何将填充0仅添加到相关字段。

回答

0

还是先排序文件B使用所述唯一标志(-u)

sort -u file.b > sortedfile.b 

然后遍历sortedfile.b并且对于每个grep的file.a.在zsh中我会做的grep从一个

foreach C (`cat sortedfile.b`) 
    grep $C file.a > /dev/null 
    if [ $? -eq 0 ]; then 
     echo $C >> res.txt 
    fi 
end 

输出重定向到/ dev/null,并且测试是否有匹配($?-eq 0)和追加(>>)从该行水库的结果。文本。

单个>将覆盖该文件。我现在在zsh有点生疏,所以可能会出现拼写错误。您可能使用的bash可能会有一些稍微不同的foreach语法。

相关问题