Fusionner des champs dans un file

J'ai un file avec 7 colonnes, un file GFF ayant des régions chromosomiques.Je veux replier les lignes où REGION = "exon" à une seule ligne dans le file.La rangée doit être repliée sur la base de régions se chevauchant avec chaque autre.

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" 

En regardant les exemples de données ci-dessus, seules les deux dernières lignes peuvent être fusionnées en une rangée. Ainsi, la nouvelle ligne deviendra.

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

Au cas où la fin de l'autre ligne aurait été plus grande que la précédente, ce serait la région END dans ce cas. En principe, s'il y a un chevauchement, prenez la région qui commence plus tôt et celle qui se termine plus tard.

Il peut y avoir plusieurs lignes d'une telle instance, ici seulement 2 dernières lignes sont là.Une chose est que la colonne ATRRIBUTE affichera certainement différents noms de transcription pour de telles lignes, qui sont généralement les mêmes dans d'autres cas.

Toute suggestion sur la façon de procéder.

Exemple mis à jour: si les 2 dernières lignes sont comme ceci

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

Ensuite, la sortie devrait être:

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

Fondamentalement, le START de la première et END de la seconde. Puisque je veux couvrir le chevauchement dans une rangée seulement, au lieu de 2 ou 3 lignes ou plus.Voici le chevauchement est entre 2 rangées, mais pourrait être entre plus de 2 rangées.

EXEMPLE MIS À JOUR (24/03/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"; 

La partie supérieure montre le chevauchement dans le brin «+» et la partie ci-dessous montre le chevauchement dans le brin «-». Le brin «-» a des régions décroissantes, donc le chevauchement sera semblable aux deux dernières rangées. . Ainsi, le chevauchement doit être par gène, car parfois des gènes différents ont des exons chevauchants également, mais ceci est très rare comme je l'ai lu dans certains articles. L'information génétique peut être extraite de la dernière colonne, présentée sous le nom "gene_name".

Les deux lignes de gene_name = TTLL10 ont des exons chevauchants, donc ils seront fusionnés, dans la sortie finale.

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

Les deux lignes de gene_name = UBE2J2 ont des exons de chevauchement.

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

SAMPLE OUTPUT

Le rest des lignes rest le même et les lignes ci-dessus sont fusionnées pour chaque gène.

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

Dans le cas où les transcript_ids sont différents, les deux identifiants de transcription seront imprimés bien que gene_name rest identique. Par exemple, si pour le gène, les identifiants de transcription étaient différents comme ci-dessous:

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

Cela va merge comme ci-dessus, mais devrait avoir les deux noms de transcription. Puisque, je crois que cela pourrait être nécessaire et sera important plus tard pour préserver les informations de transcription.

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

Une approche «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 ssortingng 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 

Je voudrais utiliser Perl pour résoudre une tâche aussi compliquée. Voici une solution partielle, vous pourriez avoir besoin de le modifier pour mieux vous convenir:

 #!/usr/bin/perl use warnings; use ssortingct; use List::Util qw{ max }; sub output { my $previous = shift; print join ' ', 'exon', @{$previous}{qw(start end score strand frame atsortingbute)}; } $\ = "\n"; my %previous; while (<>) { chomp; my ($region, $start, $end, $score, $strand, $frame, $atsortingbute) = split ' ', $_, 7; if ($. == 1) { print; } elsif ('exon' eq $region) { if (keys %previous and $start < $previous{end} # Overlap. ) { if ($end > $previous{end}) { # Not contained. $previous{atsortingbute} =~ s/; Name .*//; $previous{atsortingbute} .= '; ' . ($atsortingbute =~ /(Transcript ".*?")/)[0]; $previous{end} = $end; } } else { if (keys %previous) { output(\%previous); } %previous = ( start => $start, end => $end, score => $score, strand => $strand, frame => $frame, atsortingbute => $atsortingbute, ); } } else { output(\%previous) if keys %previous; %previous = (); } } output(\%previous) if keys %previous;