2014-12-29 5 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 merge. Но как я могу сделать вывод, только содержит столбцы, которые я хочу в файле 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) 'Но здесь у меня есть проблема с r читает большой new.bacteria.txt, так как он имеет 1.5Gb. Поэтому я думаю, что unix может сделать более легкую работу. – Colin

+0

Я не владею 'R', но мне кажется, что вы, вероятно, ищете лучший способ прочитать файл по строкам, а не все сразу, если размер является вашим ограничением. Вы должны были бы сделать то же самое, используя любую другую программу, используя «Unix» или иначе. – Donovan

ответ

0

Я думаю об использовании unix merge. Но как я могу сделать вывод содержит только столбцы, которые я хочу в файле tsv, но не все записями в файле new_bacteria.txt?

Существует действительно программа с именем merge, но, несмотря на матч с именем merge() функцией R, его цель (объединение отдельных изменений исходного файла) не то, что вам нужно; вы можете использовать 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 
Смежные вопросы