【问题标题】:Merge big text-files by an identifier column通过标识符列合并大文本文件
【发布时间】:2016-01-18 14:08:54
【问题描述】:

我有很大的文本文件(从 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 命令对文件进行了排序,然后想要合并它们。不幸的是,对我的文件进行排序时出现了问题。我遇到的问题是,排序命令不会以相同的方式对所有文件进行排序。真正的问题是这样的条目:

    ab100005
    ab1000050
    

排序后,我用 R 对标识符进行了校对。我只提取了标识符列,将其读入 R,然后比较了所有文件中的列,似乎它有时将 ab100005 排序在 ab1000050 之前,然后再排序。我不是 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

【问题讨论】:

  • 所有文件是否具有相同的 ID(忽略您提到的填充问题),因此行数(行数)相同?
  • 是的,它们的行数相同。

标签: python r bash


【解决方案1】:

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

join f1.tsv f2.tsv 

【讨论】:

    【解决方案2】:

    假设您尝试阅读的所有文件都是模式.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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2017-11-24
      • 2013-01-09
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多