我有大文本文件(从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
我尝试了两种不同的方式:
我在Python中使用了pandas数据帧。不幸的是,当它们作为pd.dataframe读入时,文件的大小会增加。我在服务器上工作,但机器还没有足够的RAM。由于这个问题,我有另一个想法......
我使用bash sort命令对文件进行了排序,然后想要合并它们。不幸的是,在排序文件时出现问题。我遇到的问题是,sort命令不会以相同的方式对所有文件进行排序。真正的问题是这样的条目:
ab100005
ab1000050
我在排序后用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
答案 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
确保你有足够的内存来阅读所有内容。