2012-07-09 113 views
5

我在下面的行中有一个文件,并希望将其转换为两列格式。将行转换为列

>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

所需的输出是

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
... 

我希望得到任何帮助。谢谢。

+2

什么问题?只需读入文件并输出每两行一行。 – Chip 2012-07-09 21:54:09

+0

是我还是做示例输入==所需的输出? – 2012-07-09 21:59:32

+0

@JonClements - 我认为'>'字符实际上在文件中。他们实际上并没有标志着一条线的开始。 – mgilson 2012-07-09 22:31:40

回答

1

一种方法:

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

这将就地编辑文件FILENAME,在每一行,是不是A的,C的,G的和T的串空间替换换行符。

+0

'perl -i -pe ...'。您使用了n开关,而您需要p。 – 2012-07-09 22:38:56

+0

感谢Chris纠正了ruakh。 – Supertech 2012-07-09 22:42:22

+0

@ChrisCharley:哎呦,修正了,谢谢! – ruakh 2012-07-10 04:02:31

0

使用awk

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

输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
6

在蟒:

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

所需的输出应在output_filepath

+1

这是一个非常聪明的使用'izip'(我永远不会想到“压缩”一个发电机自己把它分成块。) – mgilson 2012-07-09 22:23:53

+0

@mgilson:我希望我自己想出了它。我在另一个SO帖子中首先阅读了它,但我不幸找不到ATM。但是,当我读到它时,那也是确切的感觉。 – inspectorG4dget 2012-07-09 22:26:00

+0

只是一个nit-pick:'''.join(col).replace('\ n','\ t')'可能更好:''\ t'.join(col).replace('\ n ','')'。我认为它更清楚一点,它并没有在最后加上一个额外的标签。 – mgilson 2012-07-09 22:27:44

7

我不知道你是否知道BioPerl模块的读/写和其他遗传功能。你的问题可以写成这样。

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

哇!感谢大家。 – Supertech 2012-07-09 22:39:24

2

另一个Perl的选择是将记录分隔符设置为“>”,在时间中的两行来读取,则替换换行对一个选项卡:

use Modern::Perl; 

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

__DATA__ 
>00000_x1688514 
TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 
TGCTTGGACTACATATTGTTGAGGGTTGTA 

输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

对于文件:

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; 

希望这有助于!

0

在Ruby中我会使用类似:

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

,输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 
0

一个整洁的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

假设输入是真正的FASTA格式,您可以使用awkgetline功能:

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

输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA 
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA 

HTH