2012-07-09 52 views
5

Tôi có một tệp theo hàng như dưới đây và muốn chuyển đổi thành hai định dạng cột.Chuyển đổi hàng thành các cột

>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

đầu ra mong muốn là

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

tôi sẽ đánh giá cao sự giúp đỡ nào. Cảm ơn.

+2

vấn đề là gì? Chỉ cần đọc trong tập tin và đầu ra 1 dòng cho mỗi hai dòng. – Chip

+0

Có phải tôi hoặc ví dụ đầu vào == đầu ra mong muốn? –

+0

@JonClements - Tôi nghĩ rằng các ký tự '>' thực sự nằm trong tệp. Họ không thực sự đánh dấu sự bắt đầu của một dòng. – mgilson

Trả lời

1

Một cách tiếp cận:

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

chí này tại chỗ chỉnh sửa các tập tin FILENAME, thay thế một dòng mới với một không gian trong mỗi dòng đó không phải là một chuỗi của A, C, G, và T.

+0

'perl -i -pe ...'. Bạn đã sử dụng công tắc n nơi bạn cần p thay thế. –

+0

Cảm ơn Chris đã sửa ruakh. – Supertech

+0

@ChrisCharley: Rất tiếc, đã cố định, cảm ơn bạn! – ruakh

0

Sử dụng awk:

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

Output:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
6

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

Các đầu ra mong muốn phải ở trong output_filepath

+1

Đó là một cách sử dụng vô cùng thông minh của 'izip' (tôi sẽ không bao giờ nghĩ đến việc" nén "một máy phát điện với chính nó để chia thành nhiều phần.) – mgilson

+0

@mgilson: Tôi ước mình đã tự mình nghĩ ra. Tôi đọc nó đầu tiên trong một bài SO, mà tôi tiếc là không thể tìm thấy máy ATM. Nhưng đó là cảm giác chính xác khi tôi đọc nó. – inspectorG4dget

+0

Chỉ cần chọn nit: ''' .join (col) .replace ('\ n', '\ t')' có lẽ tốt hơn là: ''\ t'.join (col) .replace (' \ n ',' ') '. Tôi nghĩ rằng nó là một chút rõ ràng hơn và nó không tack một tab thêm vào cuối dòng. – mgilson

7

Tôi không biết bạn có biết các mô-đun BioPerl để đọc/viết và các chức năng di truyền khác không. Vấn đề của bạn có thể được viết như thế này.

#!/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! cảm ơn mọi người. – Supertech

2

Một lựa chọn khác Perl là để thiết lập delimiter ghi vào '>', để đọc trong hai dòng cùng một lúc, sau đó thay thế các dòng mới cho một tab:

use Modern::Perl; 

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

__DATA__ 
>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 

Output:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

Đối với một tập tin:

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; 

Hope điều này có ích!

0

Trong Ruby Tôi muốn sử dụng cái gì đó như:

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

Những kết quả đầu ra:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
0

Một giải pháp ngăn nắp 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

Giả sử đầu vào là ở định dạng đúng FASTA , bạn có thể sử dụng awk và chức năng getline:

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

Output:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

HTH

Các vấn đề liên quan