Я пытаюсь извлечь две части информации из длинной строки, содержащей гораздо больше, чем мне нужно. У меня есть табуляции .txt файл в следующем формате для повторного 115000 строк:Извлечение двух подстрок со специальными стартовыми символами из длинной строки и их конкатенация
TRINITY_DN89_c0_g1_i1 blastx match_part 2 388 5.00e-73 + 1 Target=UniRef90_UPI0005D06956 2 388;hin=2;hsn=1;db=uniref;hs=1;hf=0;hsl=387;hil=618;ql=390;pi=88.37;qc=99.23;hc=20.87;d=PREDICTED uncharacterized family 31 glucosidase KIAA1161-like;tax=Plutella xylostellaTRINITY_DN89_c0_g1_i1 blastx match_part 2 388 1.00e-72 + 1 Target=UniRef90_A0A0N1IHR0 2 388;hin=3;hsn=1;db=uniref;hs=1;hf=0;hsl=387;hil=647;ql=390;pi=82.95;qc=99.23;hc=19.94;d=Uncharacterized family 31 glucosidase KIAA1161;tax=Papilio;go=GO:0004553,GO:0005975
То, что я хотел бы, чтобы в конечном итоге это значение начало, в этом случае «TRINITY_DN89_c0_g1_i1», приложенном к каждому из значений после «go = GO:» в конце каждой строки.
Выхода я надеюсь, в этом случае выглядит следующим образом:
TRINITY_DN89_c0_g1_i1=0004553
TRINITY_DN89_c0_g1_i1=0005975
Однако символы после TRINITY_
и go=GO:
различны для каждой строки и представляют собой уникальные идентификаторы для транскриптов в транскриптоме я собранные наряду с соответствующими аннотациями термина онтологии гена.
Использование awk или sed похоже на возможность достижения этого, но я не уверен, как извлечь эти конкретные фрагменты, тем более что некоторые символы различаются между строками.
Любая помощь очень ценится!
Как обновление, я получил мои данные в следующем формате, который, безусловно, ближе, чем раньше, благодаря помощи от @shellter:
TRINITY_DN30_c0_g1_i1=0004553,GO:0005975
TRINITY_DN89_c0_g1_i1=0004553,GO:0005975
TRINITY_DN89_c0_g2_i1=0004553,GO:0005975
TRINITY_DN63_c0_g1_i1=0004190
TRINITY_DN105_c0_g1_i1=0003964
TRINITY_DN123_c0_g1_i1=0016021,GO:0005524,GO:0005215
TRINITY_DN163_c1_g1_i1=0016021,GO:0005524,GO:0005215
TRINITY_DN163_c1_g1_i1=0016021
TRINITY_DN292_c0_g1_i1=0003677,GO:0006338,GO:0006357
TRINITY_DN223_c0_g1_i1=0005858,GO:0016887,GO:0003777,GO:0003341
TRINITY_DN223_c0_g1_i1=0005509,GO:0051014,GO:0045010,GO:0051016
TRINITY_DN284_c0_g1_i1=0007010
Теперь, мой вопрос заключается в том, что я хотел бы имеют 1 строку на одно значение GO, каждый из которых начинается с его идентификатора транскрипции. Например, я хотел бы изменить первую строку выше:
TRINITY_DN30_c0_g1_i1=0004553
TRINITY_DN30_c0_g1_i1=0005975
и сделать то же самое для каждой строки с несколькими значениями GO. Чтобы быть ясным, строки могут иметь одно или несколько значений GO, а некоторые строки имеют немало. Это возможно?
Спасибо!
Большое спасибо за быстрый ответ! –
Ваше первое предложение при вводе строки непосредственно в командную строку работает очень хорошо, но было бы невозможно повторить с каждой строкой из моего файла данных. Ваше второе предложение для использования на сам файл, кажется, не выводить правильный путь, и я получаю следующий результат для первой линии: TRINITY_DN30_c0_g1_i1 \t \t BLASTX match_part 1.00E-23 \t + Target = UniRef90_UPI0006EAEBFB = 0004553 У вас есть идея, что это может исправить? –
@ScottCinel: «первое предложение»:. Да, это проблема с небольшими образцами данных. «второе предложение»: Хм .. он должен работать. Но это предполагает, что первая часть данных, которую вы хотите захватить, всегда находится перед первым пробелом в строке и что существует только один 'go = GO:'. Не видя более подробной информации о ваших данных, я не вижу простого способа решить эту проблему. И (извините, но) Я не хочу участвовать в двухчасовой сессии отладки ваших данных. Я попытался дать вам место для начала. – shellter