2015-06-28 2 views
-4

У меня есть очень большой набор данных (20000x97), который я хочу разбить на несколько подмножеств, где столбец 1 должен быть включен в каждое подмножество, тогда каждый из оставшихся столбцов должен быть в отдельных файлах вместе с столбец 1. Выход должен быть разделен на вкладку. См. Пример ниже.разделить большой набор данных на подмножества на основе столбцов

MyData (пример):

Seq      124R 239G 361R 267G 
TGAGGTAGTAGTTTGTGCTGTTG 27 15 15 52 
CACCCGTAGAACCGACCTT 58 32 44 69 
TCAAGTAATCCAGGATAGGC 4 4 6 15 
TTTGGCAATGGTAGAACTCACACTGGTGAGGT 7 45 0 33 
CACCCGTAGAACCGACCTTGC 488 740 834 1784 
CTGAGACCTCTGGGTTCTGAGCT 20 11 4 33 
CCCATAAAGTAGAAAGCAC 47 53 56 235 
TACCCATTGCATATCGGAGTTGT 174 257 206 333 

Я хочу, чтобы разбить файл на субфайлов как это:

FILE1:

Seq      124G 
TGAGGTAGTAGTTTGTGCTGTTG 27 
CACCCGTAGAACCGACCTT 58 
TCAAGTAATCCAGGATAGGC 4 
TTTGGCAATGGTAGAACTCACACTGGTGAGGT 7 
CACCCGTAGAACCGACCTTGC 488 
CTGAGACCTCTGGGTTCTGAGCT 20 
CCCATAAAGTAGAAAGCAC 47 
TACCCATTGCATATCGGAGTTGT 174 

file2:

Seq      239G 
TGAGGTAGTAGTTTGTGCTGTTG 15 
CACCCGTAGAACCGACCTT 32 
TCAAGTAATCCAGGATAGGC 4 
TTTGGCAATGGTAGAACTCACACTGGTGAGGT 45 
CACCCGTAGAACCGACCTTGC 740 
CTGAGACCTCTGGGTTCTGAGCT 11 
CCCATAAAGTAGAAAGCAC 53 
TACCCATTGCATATCGGAGTTGT 257 

file3 ...

+2

пробовали ли вы что-нибудь сами? – fugu

ответ

1

Возможно следующее будет полезно:

use strict; 
use warnings; 

my ($col, @fhs); 

# Get header's columns 
my @header = split ' ', <>; 

# open cols-1 files for appending (array of file handles); write their headers 
for $col (1 .. $#header) { 
    open $fhs[$col], '>>', "file$col.txt" 
     or die "Unable to open file$col.txt: $!"; 

    print { $fhs[$col] } "$header[0]\t$header[$col]\n"; 
} 

# split each record into fields; append fields as new records to their files 
while (<>) { 
    my @record = split; 

    for $col (1 .. $#header) { 
     print { $fhs[$col] } "$record[0]\t$record[$col]\n"; 
    } 
} 

Использование: perl script.pl dataFile

Этот подход читает только одну строку время от вашего набора данных, поэтому не должно быть проблем с обработкой «очень большого набора данных».

1

У вас есть ответ, если нет: попробуйте это ниже

use strict; 
use warnings; 
open FH, "<input.txt"; 
my @ARR = <FH>; 
my (@MAIN, @one, @two, @thr, @fou); 
foreach (@ARR) 
{ 
    push (@MAIN, $1), push (@one, $2),push (@two, $3),push (@thr, $4),push (@fou, $5), if($_ =~ /(\S+)\s+?(\S+)\s+?(\S+)\s+?(\S+)\s+?(\S+)/); 
} 
foreach (1..4) 
{ 
    open FH, ">FILE$_".".txt"; 
    my @ARR; 
    for(my $i = 0;$i<@MAIN;$i++) 
    { 
     if($_ == 1){@ARR = @one;} 
     if($_ == 2){@ARR = @two;} 
     if($_ == 3){@ARR = @thr;} 
     if($_ == 4){@ARR = @fou;} 
     print FH $MAIN[$i],"\t",$ARR[$i],"\n"; 
    } 
} 
1

Вы можете попробовать это

awk -vOFS="\t" '{for(i=2;i<=NF;i++){ f=sprintf("file_%d.txt",i-1); if(f in F){ print $1,$i >>f }else{ print $1,$i >f; F[f]} close(f) }}' file 

Лучше читаемую версию

awk -vOFS="\t" '{ 
     # Loop through fields 
     for(i=2;i<=NF;i++) 
     { 
      # Filename variable 
      f=sprintf("file_%d.txt",i-1) 

      # If filename index exists in array F 
      # Append to file if exists 
      if(f in F) 
      { 
       print $1,$i >>f 
      } 
     else{ 
       # write to file 
       print $1,$i >f 

       # Array F where key is filename 
       F[f] 
      } 
      # close file since we do not know how many columns exists 
      # in your original file, to avoid too many open files error 
      # we close everytime, and append if filename exists in array F 
      close(f) 
     } 
    }' file 
+0

мой файл содержит 96 столбцов + имена строк в столбце 1. Это что-то меняет в скрипте – BioMan

+0

, не волнуйтесь, это сработает –

+0

Я получил эту ошибку: awk: invalid -v option – BioMan

Смежные вопросы