2012-07-09 23 views
5

Ho un file in righe come sotto e vorrei convertirlo in due colonne.Converti righe in colonne

>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

output desiderato è

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

Gradirei qualsiasi aiuto. Grazie.

+2

Qual è il problema? Basta leggere nel file ed emettere 1 riga per ogni due righe. – Chip

+0

Sono io o l'input di esempio == l'output desiderato? –

+0

@JonClements - Penso che i caratteri '>' siano effettivamente nel file. In realtà non stanno segnando l'inizio di una linea. – mgilson

risposta

1

Un approccio:

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

Ciò a posto Modificare il file FILENAME, la sostituzione di un ritorno a capo con uno spazio in ogni riga che non è una stringa di A di, C di, G e T.

+0

'perl -i -pe ...'. Hai usato l'opzione n dove invece hai bisogno di p. –

+0

Grazie Chris per aver corretto ruakh. – Supertech

+0

@ChrisCharley: Whoops, risolto, grazie! – ruakh

0

Uso awk:

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

uscita:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
6

In pitone:

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') 

L'uscita desiderata deve essere contenuto nel output_filepath

+1

Questo è un uso estremamente intelligente di 'izip' (non avrei mai pensato di" zippare "un generatore con se stesso per romperlo in pezzi). – mgilson

+0

@mgilson: Vorrei averlo inventato io stesso. L'ho letto prima in un altro post SO, che purtroppo non riesco a trovare ATM. Ma quella era la sensazione esatta quando l'ho letto anch'io. – inspectorG4dget

+0

Solo un pignolo: ''' .join (col) .replace ('\ n', '\ t')' è probabilmente meglio di: ''\ t'.join (col) .replace (' \ n ',' ') '. Penso che sia un po 'più chiaro e non appunta una tabulazione extra alla fine della riga. – mgilson

7

Non so se sei a conoscenza dei moduli BioPerl per la lettura/scrittura e altre funzioni genetiche. Il tuo problema può essere scritto in questo modo.

#!/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

wow! grazie a tutti. – Supertech

2

Un'altra opzione Perl è impostare il delimitatore record '>', per leggere in due righe alla volta, quindi sostituire la nuova riga per una scheda:

use Modern::Perl; 

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

__DATA__ 
>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 

uscita:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

Per un file:

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; 

Speranza questo aiuta!

0

In Ruby userei qualcosa di simile:

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

quali uscite:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
0

Una soluzione più ordinato 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

Supponendo che l'ingresso è in vero formato FASTA , è possibile utilizzare awk e la funzione getline:

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

uscita:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

HTH