5

我有一个如下行中的文件,并想转换为两列格式。

>00000_x1688514
TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968
TGCTTGGACTACATATTGTTGAGGGTTGTA
...

所需的输出是

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA
...

我将不胜感激任何帮助。谢谢。

4

8 回答 8

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
于 2012-07-09T22:25:56.877 回答
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

于 2012-07-09T22:09:40.720 回答
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;

希望这可以帮助!

于 2012-07-09T23:20:45.167 回答
1

One approach:

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

This will in-place edit the file FILENAME, replacing a newline with a space in every line that isn't a string of A's, C's, G's, and T's.

于 2012-07-09T21:55:29.383 回答
0

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

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

输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA

高温高压

于 2012-07-10T11:50:29.717 回答
0

在 Ruby 中,我会使用类似的东西:

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

哪个输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA
于 2012-07-10T00:00:21.347 回答
0

使用awk

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

输出:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA
于 2012-07-09T22:07:30.967 回答
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)
于 2012-07-10T00:40:40.847 回答