2012-07-09 20 views
5

Tengo un archivo en filas como a continuación y me gustaría convertirlo a formato de dos columnas.Convertir filas en columnas

>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

salida deseada es

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

Le agradecería cualquier ayuda. Gracias.

+2

Cuál es el problema? Solo lea en el archivo y genere 1 línea por cada dos líneas. – Chip

+0

¿Soy yo o el ejemplo de entrada == resultado deseado? –

+0

@JonClements - Creo que los caracteres '>' están realmente en el archivo. En realidad, no marcan el comienzo de una línea. – mgilson

Respuesta

1

Un enfoque:

perl -i -pe 's/\n//unless m/^[ACGT]+$/' FILENAME 

editar Esto a su lugar el archivo FILENAME, en sustitución de una nueva línea con un espacio en cada línea que no es una cadena de A de, C de, G y T.

+0

'perl -i -pe ...'. Usaste el conmutador n donde necesitas p en su lugar. –

+0

Gracias Chris por corregir ruakh. – Supertech

+0

@ChrisCharley: ¡Ups, arreglado, gracias! – ruakh

0

Usando awk:

awk '{ printf "%s", $0 (substr($0, 1, 1) == ">" ? " " : ORS) }' infile 

de salida:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
6

en Python:

fd = open('filepath') 
cols = izip(fd, fd) 
with open('output_filepath') as outfile: 
    for col in cols: 
     outfile.write('\t'.join(col).replace('\n', '') +'\n') 

la salida deseada debe estar en output_filepath

+1

Ese es un uso extremadamente inteligente de 'izip' (nunca hubiera pensado en" comprimir "un generador consigo mismo para dividirlo en trozos). – mgilson

+0

@mgilson: Ojalá lo hubiera ideado yo mismo. Lo leí primero en otra publicación SO, que desafortunadamente no puedo encontrar cajero automático. Pero eso fue una sensación exacta cuando lo leí también. – inspectorG4dget

+0

Simplemente un nit-pick: ''' .join (col) .replace ('\ n', '\ t')' es probablemente mejor como: ''\ t'.join (col) .replace (' \ n ',' ') '. Creo que es un poco más claro y no pega una pestaña extra al final de la línea. – mgilson

7

No sé si conoce los módulos de BioPerl para leer/escribir y otras funciones genéticas. Tu problema puede escribirse así.

#!/usr/bin/perl 
use strict; 
use warnings; 
use Bio::SeqIO; 

my $file = 'o33.txt'; 
my $in = Bio::SeqIO->new(-file => $file, 
          -format => 'fasta'); 

while (my $seq = $in->next_seq()) { 
    print $seq->id, "\t", $seq->seq, "\n"; 
} 

__END__ 
00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
+0

¡guau! gracias a todos. – Supertech

2

Otra opción Perl es establecer el delimitador de registro a '>', para leer en dos líneas a la vez, y luego sustituir el salto de línea para una pestaña:

use Modern::Perl; 

local $/ = '>'; 
do { s/\n/\t/; print } 
    for <DATA>; 

__DATA__ 
>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 

Salida:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

Para un archivo:

use Modern::Perl; 
use autodie; 

open my $inFile, '<', 'inFile.txt'; 
open my $outFile, '>', 'outFile.txt'; 

local $/ = '>'; 
do { s/\n/\t/; print $outFile $_ } 
    for <$inFile>; 

close $inFile; 
close $outFile; 

esperanza ¡esto ayuda!

0

En Rubí me gustaría usar algo como:

File.readlines('test.txt').map(&:strip).each_slice(2) do |row| 
    puts row.join(' ') 
end 

que da salida:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
0

Una solución más ordenado Python:

from itertools import izip 

with open('test.txt') as inf, open('newtest.txt', 'w') as outf: 
    for head,body in izip(inf, inf): 
     outf.write(head.rstrip() + ' ' + body) 
0

Suponiendo que la entrada es en cierto formato FASTA , puede usar awk y la función getline:

awk '/^>/ { printf "%s ", $0; getline; print }' file.txt 

Salida:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

HTH

Cuestiones relacionadas