通过标识符列合并大文本文件

时间:2016-01-18 14:08:55

标签: python r bash

我有大文本文件(从5GB到35GB)。我想按列连接这些文件(或者更好,我想合并它们)。所有文件都有一个标识符列,它们在此列中具有相同的条目,因此可以合并它们。文件如下所示:

文件1(文件有超过1000列,制表符分隔):

ID          col1   col2
ab1000025   1      2
ab1000053   2      3
ab1250223   3      1

文件2:

ID          col3   col4
ab1000025   2      2
ab1000053   2      1
ab1250223   3      1

我尝试了两种不同的方式:

  1. 我在Python中使用了pandas数据帧。不幸的是,当它们作为pd.dataframe读入时,文件的大小会增加。我在服务器上工作,但机器还没有足够的RAM。由于这个问题,我有另一个想法......

  2. 我使用bash sort命令对文件进行了排序,然后想要合并它们。不幸的是,在排序文件时出现问题。我遇到的问题是,sort命令不会以相同的方式对所有文件进行排序。真正的问题是这样的条目:

    ab100005
    ab1000050
    
  3. 我在排序后用R证明了标识符。我只提取了标识符列,将其读入R,然后比较了所有文件中的列,似乎有时在ab1000050之前排序ab100005,然后排在后面。我不是100%确定这是否是提取或读入R的问题,但我想不是因为我也证明原始的排序文件和相同的位置(行号)是不同文件中的不同条目。这不应该。

    我使用的排序命令是:

    sort -t$'\t' -k1,1 -n file.txt 
    

    sort -t$'\t' -k1,1 -h file.txt
    

    也许某人有完全不同的想法来合并文件(使用bash,Python或R)。这也是完美的。上述两个文件的所需输出为:

    ID          col1    col2    col3    col4
    ab1000025   1       2       2       2
    ab1000053   2       3       2       1
    ab1250223   3       1       3       1
    

2 个答案:

答案 0 :(得分:3)

假设文件格式正确且两个文件具有相同的ID(内部联接)

join f1.tsv f2.tsv 

答案 1 :(得分:0)

您可以使用类似的内容,假设您尝试阅读的所有文件都是模式.csv

l <- do.call(cbind, lapply(list.files('.', pattern = '.csv'),
             function(x) read.csv(x, sep = ' ')))
df <- df[, -4]
df
         ID col1 col2 col3 col4
1 ab1000025    1    2    2    2
2 ab1000053    2    3    2    1
3 ab1250223    3    1    3    1

确保你有足够的内存来阅读所有内容。

相关问题