Объединить поля в файл

У меня есть файл с 7 столбцами, файл GFF с хромосомными областями. Я хочу свернуть строки, где REGION = "exon", только одна строка в файле. Строка должна быть свернута на основе областей, перекрывающихся с каждым Другие.

REGION START END SCORE STRAND FRAME ATTRIBUTE exon 26453 26644 . + . Transcript "XM_092971"; Name "XM_092971" exon 26842 27020 . + . Transcript "XM_092971"; Name "XM_092971" exon 30355 30899 . - . Transcript "XM_104663"; Name "XM_104663" GS_TRAN 30355 34083 . - . GS_TRAN "Hs22_30444_28_1_1"; Name "Hs22_30444_28_1_1" snp 30847 30847 . + . SNP "rs2971719"; Name "rs2971719" exon 31012 31409 . - . Transcript "XM_104663"; Name "XM_104663" exon 34013 34083 . - . Transcript "XM_104663"; Name "XM_104663" exon 40932 41071 . + . Transcript "XM_092971"; Name "XM_092971" snp 44269 44269 . + . SNP "rs2873227"; Name "rs2873227" snp 45723 45723 . + . SNP "rs2227095"; Name "rs2227095" exon 134031 134495 . - . Transcript "XM_086913"; Name "XM_086913" exon 134034 134457 . - . Transcript "XM_086914"; Name "XM_086914" 

Глядя на данные примера выше, только две последние строки могут быть объединены в одну строку. Итак, новая строка станет.

 exon 134031 134495 . - . Transcript "XM_086913"; Name "XM_086913" 

В случае, если конец другой строки был бы больше, чем предыдущий, это будет область END в этом случае. В любом случае, если есть какое-либо перекрытие, тогда возьмите область, которая начинается раньше, и та, которая заканчивается позже.

Там может быть несколько строк такого экземпляра, здесь есть только последние 2 строки. Одна вещь состоит в том, что столбец ATRRIBUTE определенно будет показывать разные имена транскриптов для таких строк, которые в большинстве случаев аналогичны в других случаях.

Любые предложения о том, как действовать.

ОБНОВЛЕНО ПРИМЕР: Если последние 2 строки похожи на это

  exon 134031 134457 . - . Transcript "XM_086913"; Name "XM_086913" exon 134034 134495 . - . Transcript "XM_086914"; Name "XM_086914" 

Затем Выход должен быть:

 exon 134031 134495 . - . Transcript "XM_086913"; Transcript "XM_086914" 

В основном START от первого и END от второго. Поскольку я хочу покрыть перекрытие только в одной строке, вместо 2 или 3 или более строк. Здесь перекрытие находится между двумя строками, но может быть между более чем двумя строками.

ОБНОВЛЕННЫЙ ПРИМЕР (3/24/2014)

 chr1 HAVANA stop_codon 1120520 1120522 . + 0 gene_id "ENSG00000162571.9"; transcript_id "ENST00000379288.3"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "TTLL10-001"; level 2; tag "CCDS"; ccdsid "CCDS8.1"; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002420.2"; chr1 HAVANA UTR 1115077 1115233 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000379288.3"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "TTLL10-001"; level 2; tag "CCDS"; ccdsid "CCDS8.1"; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002420.2"; chr1 HAVANA UTR 1115414 1115433 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000379288.3"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "TTLL10-001"; level 2; tag "CCDS"; ccdsid "CCDS8.1"; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002420.2"; chr1 HAVANA UTR 1120520 1121244 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000379288.3"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "protein_coding"; transcript_status "KNOWN"; transcript_name "TTLL10-001"; level 2; tag "CCDS"; ccdsid "CCDS8.1"; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002420.2"; chr1 HAVANA transcript 1115864 1119307 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000460998.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "processed_transcript"; transcript_status "KNOWN"; transcript_name "TTLL10-004"; level 2; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002423.1"; chr1 HAVANA exon 1115864 1116240 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000460998.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "processed_transcript"; transcript_status "KNOWN"; transcript_name "TTLL10-004"; level 2; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002423.1"; chr1 HAVANA *exon 1117121 1117195* . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000460998.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "processed_transcript"; transcript_status "KNOWN"; transcript_name "TTLL10-004"; level 2; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002423.1"; chr1 HAVANA *exon 1117150 1117826* . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000460998.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "processed_transcript"; transcript_status "KNOWN"; transcript_name "TTLL10-004"; level 2; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002423.1"; chr1 HAVANA exon 1118256 1118427 . + . gene_id "ENSG00000162571.9"; transcript_id "ENST00000460998.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "TTLL10"; transcript_type "processed_transcript"; transcript_status "KNOWN"; transcript_name "TTLL10-004"; level 2; havana_gene "OTTHUMG00000000851.3"; havana_transcript "OTTHUMT00000002423.1"; chr1 HAVANA transcript 1190648 1209229 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA exon 1209046 1209229 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA exon 1203113 1203372 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA CDS 1203241 1203372 . - 0 gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA start_codon 1203370 1203372 . - 0 gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA stop_codon 1203238 1203240 . - 0 gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA exon 1198726 1198766 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA exon 1192588 1192690 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA exon 1192372 1192510 . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA *exon 1191425 1191505* . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; chr1 HAVANA *exon 1190648 1191470* . - . gene_id "ENSG00000160087.16"; transcript_id "ENST00000473215.1"; gene_type "protein_coding"; gene_status "KNOWN"; gene_name "UBE2J2"; transcript_type "nonsense_mediated_decay"; transcript_status "KNOWN"; transcript_name "UBE2J2-003"; level 2; havana_gene "OTTHUMG00000001911.7"; havana_transcript "OTTHUMT00000005432.2"; 

Верхняя часть показывает перекрытие в цепочке «+», а нижняя часть показывает перекрытие в нитке «-». Строка «-» имеет уменьшающиеся области, поэтому перекрытие будет выглядеть, как показано в последних двух строках. Оба представляют собой разные гены . Такое перекрытие должно быть на каждый ген, так как иногда разные гены имеют перекрывающиеся экзоны, но это очень редко, как я читал в некоторых сообщениях. Информация о генах может быть извлечена из последнего столбца, представленного как «имя гена».

Две строки из gene_name = TTLL10 имеют перекрывающиеся экзоны, поэтому они будут объединены в конечном выходе.

 chr1 HAVANA *exon 1117121 1117195* . + . transcript_id "ENST00000460998.1"; gene_name "TTLL10"; chr1 HAVANA *exon 1117150 1117826* . + . transcript_id "ENST00000460998.1"; gene_name "TTLL10"; 

Две строки из gene_name = UBE2J2 имеют перекрывающиеся экзоны.

  chr1 HAVANA *exon 1191425 1191505* . - . transcript_id "ENST00000473215.1"; gene_name "UBE2J2"; chr1 HAVANA *exon 1190648 1191470* . - . transcript_id "ENST00000473215.1"; gene_name "UBE2J2"; 

ВЫХОД ОБРАЗЦА

Остальные строки остаются такими же, и приведенные выше строки объединяются для каждого гена.

 chr1 HAVANA *exon 1117121 1117826* . + . transcript_id "ENST00000460998.1"; gene_name "TTLL10"; chr1 HAVANA *exon 1190648 1191505* . - . transcript_id "ENST00000473215.1"; gene_name "UBE2J2"; 

В случае, если transcript_ids различны, оба идентификатора транскрипта будут напечатаны, хотя имя гена останется таким же. Например, если для гена идентификатор транскрипта был другим, как показано ниже:

  chr1 HAVANA *exon 1191425 1191505* . - . transcript_id "ENST00000473215.1"; gene_name "UBE2J2"; chr1 HAVANA *exon 1190648 1191470* . - . transcript_id "ENST00000473215.2"; gene_name "UBE2J2"; 

Это будет сливаться так, как указано выше, но должно иметь оба имени расшифровки. Поскольку я считаю, что это может потребоваться и будет важно позже сохранить информацию о расшифровке.

  chr1 HAVANA *exon 1190648 1191505* . - . transcript_id "ENST00000473215.1"; "ENST00000473215.2" gene_name "UBE2J2"; 

2 Solutions collect form web for “Объединить поля в файл”

Подход «awk»,

 awk ' $1!="exon" { # If the first died is unequal to "exon" if(previous)print previous # If there is a previous line then print it print # Print the current line previous=start=end=exon_seq="" # Set all variable to an empty string next # Move on to the next line in the input file } { if(exon_seq) { # if there is a sequence of lines with "exon in field 1 if(start<=$2 && end>=$3) # if the start value (field 2) of the previous line # is less or equal to the current line and the end # value of the previous line is greater than or # equal to field 3 of the current line next # then do nothing and read the next line else # if there is no overlap, print previous # then print the previous line } else { # if we are not already in the a sequence of # "exon" lines, then this is the first one exon_seq=1 # so exon_seq should become 1 } previous=$0; start=$2; end=$3 # `start` become field2, `end` becomes field 3 and # `previous` becomes the current record (line) } END{ # After all lines are processed if(previous) print previous # If there still is a previous line, then print it } ' file 

Я бы использовал Perl для решения такой сложной задачи. Вот частичное решение, вам может потребоваться настроить его, чтобы он вам лучше:

 #!/usr/bin/perl use warnings; use strict; use List::Util qw{ max }; sub output { my $previous = shift; print join ' ', 'exon', @{$previous}{qw(start end score strand frame attribute)}; } $\ = "\n"; my %previous; while (<>) { chomp; my ($region, $start, $end, $score, $strand, $frame, $attribute) = split ' ', $_, 7; if ($. == 1) { print; } elsif ('exon' eq $region) { if (keys %previous and $start < $previous{end} # Overlap. ) { if ($end > $previous{end}) { # Not contained. $previous{attribute} =~ s/; Name .*//; $previous{attribute} .= '; ' . ($attribute =~ /(Transcript ".*?")/)[0]; $previous{end} = $end; } } else { if (keys %previous) { output(\%previous); } %previous = ( start => $start, end => $end, score => $score, strand => $strand, frame => $frame, attribute => $attribute, ); } } else { output(\%previous) if keys %previous; %previous = (); } } output(\%previous) if keys %previous; 
  • Может ли сценарий bash подключаться к файлу?
  • Изменение оболочки входа по умолчанию в / bin / bash для ВСЕХ пользователей ldap с сервера LDAP - не клиент
  • Как перезапустить скрипт Python автоматически, если он убит или умирает
  • использование функции скрипта вместо ввода с клавиатуры
  • Использование tmux для презентаций
  • Как сделать переменную из подоболочки доступной в родительской оболочке
  • Zsh, нечувствительное между `_` и` -`
  • как выбрать одну звуковую дорожку, если в медиафайле есть несколько звуковых дорожек с использованием mpv?
  • Почему на выходе моей команды есть пустые строки ?: find ~ / x / y / | shuf> ~ / Desktop / z.txt
  • Является ли трубопровод из простых команд?
  • Поток grep из подпрограммы, а не файл хвоста
  • Interesting Posts

    не удалось сохранить состояние виртуальной машины

    избегать множественных труб, поврежденных из-за отсутствия команды

    Найти и заменить с помощью sed с помощью подстановочных знаков при поиске и замене

    Как игнорировать ошибки -l в поиске

    Как принудительно обновлять файл, если оставить его без изменений через 55 минут?

    Могу ли я заразиться в этом случае, если я запустил live cd?

    Как получить часть строк из всех .txt-файлов в каталоге?

    Не работает привязка к интерфейсу VPN

    Не удалось запустить локально построенный ntpd из сценария системной службы

    ASCII в двоичные и двоичные для ASCII-инструментов преобразования?

    как написать `fuser -k -n tcp 80` в скрипт bash?

    Как бинарировать цветное изображение?

    Как я могу открыть сетевой интерфейс non-boot (ONBOOT = no) с помощью iproute2?

    Установите яркость экрана: xbacklight не работает на HDMI, xrandr -brightness не прилипает

    Как правильно и легко настроить `xdg-open` без какой-либо среды?

    Linux и Unix - лучшая ОС в мире.