Сортировать первый столбец при объединении второго столбца

Ищу решение следующей проблемы. У меня есть текстовый файл с идентификаторами генов в первом столбце, а во втором - GOterms. Поскольку каждый ген имеет несколько аннотированных GOterms, идентичные geneID встречаются несколько раз (с разными GOterms во втором столбце. Я хочу только объединить уникальные geneID с GOterms: у меня есть:

TRINITY_DN10151_c0_g1   GO:0004175
TRINITY_DN10151_c0_g1   GO:0004252
TRINITY_DN10151_c0_g1   GO:0006508
TRINITY_DN10151_c0_g1   GO:0008233
TRINITY_DN102626_c42_g1 GO:0005198
TRINITY_DN102626_c42_g1 GO:0042302
TRINITY_DN102626_c58_g1 GO:0004175

Я хочу:

TRINITY_DN10151_c0_g1 GO:0004175-GO:0004252-GO:0006508-GO:0008233
TRINITY_DN102626_c42_g1 GO:0005198-GO:0042302

так далее..

Кроме того, важно (и я действительно не знаю, как решить эту проблему), чтобы каждая комбинация терминов GO встречалась один раз. Итак, если два гена имеют одинаковую комбинацию терминов GO (A, B и C) в столбце 2, они оба должны иметь A-B-C. А также не A-C-B ..

Я пробовал использовать sort и uniq, но в итоге удалял только строки.

Может ли кто-нибудь помочь мне с решением для unix?


person T_R    schedule 24.08.2018    source источник
comment
Я заметил, что формат моего текста изменился. Итак, в моем файле в каждой строке теперь есть один идентификатор гена с одним термином GO: TRINITY_DN10151_c0_g1 GO: 0004175 Но я хочу, чтобы все GOterms с похожими идентификаторами гена были объединены. Только с одним порядком комбинации GOterm для аналогичных комбинаций GOterm.   -  person T_R    schedule 24.08.2018
comment
Что случилось с c58? Вы удаляете строки ввода, которые не объединяются с другими строками ввода?   -  person    schedule 24.08.2018


Ответы (1)


Вы можете сделать это с помощью довольно загадочной команды sed. (Каждая sed команда банальна или загадочна.)

sort filename | sed -e :a -e '$!N;s/^\([^ ]* \) *\(.*\)\n\1 */\1\2-/;ta' -e 'P;D' 

В вольном переводе это гласит: «Добавьте следующую строку к этой и замените новую строку и второе имя гена дефисом, если имена двух генов совпадают».

И sort состоит в том, чтобы сохранить последовательность GOterm в генах.

person Beta    schedule 27.08.2018
comment
Кажется, это еще не работает ... Я получаю точно такой же результат, как если бы просто использовал sort Filename. Как я могу объединить GO-термины в подгруппы (как указано выше)? - person T_R; 27.08.2018
comment
@T_R: Думаю, это проблема с пробелами. Я предположил, что это были пробелы в вашем входном файле; если это вкладки или их комбинация, команда может не работать. Попробуйте sed 'N;s/\n[^ ]* /-/' и сообщите результат (здесь, в комментарии). - person Beta; 27.08.2018