2014-12-29 80 views
0

我有两个文件合并两个文件一列

$ wc -l new_bacteria.txt 
28633861 new_bacteria.txt 

$ wc -l allin1_trinity_bacteria_blastx.tsv 
4352 allin1_trinity_bacteria_blastx.tsv 

$ head new_bacteria.txt 
gi|406035365|ref|ZP_11042729.1| Acinetobacter parvus 
gi|406035366|ref|ZP_11042730.1| Acinetobacter parvus 
gi|406035367|ref|ZP_11042731.1| Acinetobacter parvus 
gi|406035368|ref|ZP_11042732.1| Acinetobacter parvus 
gi|406035369|ref|ZP_11042733.1| Acinetobacter parvus 
gi|406035370|ref|ZP_11042734.1| Acinetobacter parvus 
gi|406035371|ref|ZP_11042735.1| Acinetobacter parvus 
gi|406035372|ref|ZP_11042736.1| Acinetobacter parvus 
gi|406035373|ref|ZP_11042737.1| Acinetobacter parvus 
gi|406035374|ref|ZP_11042738.1| Acinetobacter parvus 

$ head allin1_trinity_bacteria_blastx.tsv 

c91_g1_i1 gi|46447089|ref|YP_008454.1| 39.60 101 59 1 306 4 1676 1774 6e-11 68.2 
c146_g1_i1 gi|357399595|ref|YP_004911520.1| 39.53 86 47 2 246 4 49 134 5e-06 52.0 
c202_g1_i1 gi|508605652|ref|YP_006991274.2| 62.16 37 14 0 154 44 49 85 3e-06 45.4 
c202_g1_i1 gi|508605652|ref|YP_006991274.2| 63.16 19 7 0 201 145 33 51 3e-06 27.7 
c202_g1_i1 gi|508605652|ref|YP_006991274.2| 76.92 13 3 0 242 204 20 32 3e-06 21.6 
c224_g1_i1 gi|395217261|ref|ZP_10401556.1| 72.62 84 23 0 260 9 274 357 6e-38  144 
c230_g1_i1 gi|261381445|ref|ZP_05986018.1| 57.50 40 17 0 248 129 57 96 2e-09 45.8 
c230_g1_i1 gi|261381445|ref|ZP_05986018.1| 50.00 42 19 1 120 1 101 142 2e-09 41.2 
c294_g1_i1 gi|298242911|ref|ZP_06966718.1| 37.33 75 46 1 14 238 814 887 3e-07 56.2 
c304_g1_i1 gi|296393792|ref|YP_003658676.1| 42.86 56 32 0 56 223 17 72 6e-06 51.2 

我想allin1_trinity_bacteria_blastx.tsv的第二列到这两个文件合并。我希望输出一个文件具有相同的TSV文件的行数,因为另一个文件非常大。

这在R中是一件容易的工作,但是因为这里我的注释文件(new_bacteria.txt)非常大。我正在考虑使用unix合并。但我怎样才能使输出只包含我想在tsv文件中的列,但不是new_bacteria.txt文件中的所有留置符?

谢谢!

+0

欢迎来到Stackoverflow!请注意,您需要更具体一些,并告诉我们您已经尝试了哪些(并且无法使用)。 – Donovan

+0

在R中我们可以这样做:'t1 <-read.table(“allin1_trinity_bacteria_blastx.tsv”)t2 <-read.table(“new_bacteria.txt”)colnames(t1)[1:2] < - c(“id” ,“hit”)colnames(t2)< - c(“hit”,“taxa”)result <-merge(t1,t2,by =“hit”,all.x = T)'但是这里我遇到了问题因为它具有1.5Gb,因此它读取了大的new.bacteria.txt。所以我想,如果unix可以做一个更简单的工作。 – Colin

+0

我不熟悉'R',但在我看来,您可能正在寻找一种更好的方法来逐行读取文件,而不是一次全部读取,如果大小是您的限制。你将不得不使用任何其他程序,使用“Unix”或其他方式做同样的事情。 – Donovan

回答

0

我在想使用unix合并。但我怎样才能使输出 只包含我想要在tsv文件中的列,但不是所有的 留置在new_bacteria.txt文件中?

确实是有一个名为merge程序,但尽管名称匹配R的merge()功能,它的目的(合并到原始文件不同的变化)是不是你所需要的东西;你可以使用join。请注意,文件必须在连接字段上排序。示例脚本在加入之前对这两个文件进行排序;如果new_bacteria.txt已经排序,则可以使用它而不是sorted.txt;如果您想在allin1_trinity_bacteria_blastx.tsv上运行多个连接,则可能需要将其仅排序一次,然后重新使用sorted.tsv

sort -k2b allin1_trinity_bacteria_blastx.tsv >sorted.tsv 
sort      new_bacteria.txt >sorted.txt 
join -1 2 sorted.tsv sorted.txt