2016-04-21 1 views
0

Я пытаюсь извлечь две части информации из длинной строки, содержащей гораздо больше, чем мне нужно. У меня есть табуляции .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, а некоторые строки имеют немало. Это возможно?

Спасибо!

ответ

0

Учитывая данные примеры, вот версия стендовое

sed 's/ .*go=GO:/=/;s/,.*$//' <<< "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=0004553 

Узоры замещения работают как «найти первое место в линии, а затем сопоставить все путь к go=GO:. Замените все это на = '. Такая же идея с s/,.*$//. Она находит первую запятую в остальном тексте и соответствует концу строки .*$, а заменяет // (ничего).

Учитывая ваши данные в файл, вы можете просто передать имя файла в качестве аргумента sed и использовать перенаправление оболочки для записи нового файла, т.е.

sed 's/ .*go=GO:/=/;s/,.*$//' file > outFile 

Это позволяет сохранить резервную копию вашего исходного файла, поэтому, если вы обнаружите проблему с выходом, вам не придется тратить время на восстановление исходного файла (или его копирование из вашего архива или что-то еще).

Если вы собираетесь построить это в сценарном решение, и вы хотите использовать то же имя во всем (независимо от версии данных внутри), новые версии sed имеют возможность -i (INPLACE), так. ..

sed -i 's.....' file 

Будет редактировать ваш файл на месте.

Если вы используете это на Mac или других версий, основанных на Berkely Unix/Linux, то вы должны сказать -i возможность не беспокоиться о файле резервной копии, а также использовать

sed -i"" 's....' file 

IHTH

+0

Большое спасибо за быстрый ответ! –

+0

Ваше первое предложение при вводе строки непосредственно в командную строку работает очень хорошо, но было бы невозможно повторить с каждой строкой из моего файла данных. Ваше второе предложение для использования на сам файл, кажется, не выводить правильный путь, и я получаю следующий результат для первой линии: TRINITY_DN30_c0_g1_i1 \t \t BLASTX match_part 1.00E-23 \t + Target = UniRef90_UPI0006EAEBFB = 0004553 У вас есть идея, что это может исправить? –

+0

@ScottCinel: «первое предложение»:. Да, это проблема с небольшими образцами данных. «второе предложение»: Хм .. он должен работать. Но это предполагает, что первая часть данных, которую вы хотите захватить, всегда находится перед первым пробелом в строке и что существует только один 'go = GO:'. Не видя более подробной информации о ваших данных, я не вижу простого способа решить эту проблему. И (извините, но) Я не хочу участвовать в двухчасовой сессии отладки ваших данных. Я попытался дать вам место для начала. – shellter

 Смежные вопросы

  • Нет связанных вопросов^_^