5

以下のような行のファイルがあり、2列形式に変換したいと思います。

>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 のもう 1 つのオプションは、レコード区切り文字を '>' に設定して、一度に 2 行ずつ読み取り、改行をタブに置き換えることです。

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

1 つのアプローチ:

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

これにより、ファイルがインプレース編集されFILENAME、A、C、G、および T の文字列ではないすべての行で、改行がスペースに置き換えられます。

于 2012-07-09T21:55:29.383 に答える
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

入力が真の形式であると仮定すると、次の関数FASTAを使用できます。awkgetline

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

出力:

>00000_x1688514 TGCTTGGACTACATATGGTTGAGGGTTGTA
>00001_x238968 TGCTTGGACTACATATTGTTGAGGGTTGTA

HTH

于 2012-07-10T11:50:29.717 に答える
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 に答える