Объединить текстовые файлы с разделителями табуляции в один файл - PullRequest
2 голосов
/ 23 декабря 2010

Какой самый простой способ объединения / объединения всех файлов в папке (с разделителями табуляции) в один файл?Все они имеют уникальный столбец (первичный ключ).На самом деле мне нужно только объединить определенный столбец и ссылку на этот первичный ключ, чтобы выходной файл содержал новый столбец для каждого файла.Пример:

KEY#  Ratio1  Ratio2  Ratio3
1     5.1     4.4     3.3
2     1.2     2.3     3.2
etc....

В каждом файле есть много других столбцов, которые мне не нужно объединять в выходном файле, мне просто нужны эти столбцы "коэффициента", связанные столбцом уникального ключа.

Я использую OS X Snow Leopard, но у меня есть доступ к нескольким машинам Linux.

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

На самом деле я потратил некоторое время на изучение Perl и решил проблему самостоятельно.Я решил поделиться исходным кодом, если у кого-то возникнет похожая проблема.

#!/usr/bin/perl -w

#File: combine_all.pl
#Description: This program will combine the rates from all "gff" files in the current directory.

use Cwd; #provides current working directory related functions
my(@handles);

print "Process starting... Please wait this may take a few minutes...\n";

unlink"_combined.out"; #this will remove the file if it exists

for(<./*.gff>){
  @file = split("_",$_);
  push(@files, substr($file[0], 2));
  open($handles[@handles],$_);
}

open(OUTFILE,">_combined.out");

foreach (@files){
  print OUTFILE"$_" . "\t";
}

#print OUTFILE"\n";

my$continue=1;

while($continue){
  $continue=0;

  for my$op(@handles){
    if($_=readline($op)){
      my@col=split;
      if($col[8]) {
        $gibberish=0;
        $col[3]+=0;
        $key = $col[3];
        $col[5]+=0;  #otherwise you print nothing
        $col[5] = sprintf("%.2f", $col[5]);
        print OUTFILE"$col[5]\t";
        $continue=1;
      } else {
        $key = "\t";
        $continue=1;
        $gibberish=1;
      }
    }else{
      #do nothing
    }
  }
  if($continue != 0 && $gibberish != 1) {
    print OUTFILE"$key\n";
  } else {
    print OUTFILE"\n";
  }
}
undef@handles; #closes all files
close(OUTFILE);

print "Process Complete! The output file is located in the current directory with the filename: _combined.out\n";
2 голосов
/ 23 декабря 2010

используйте утилиту join (1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...