2013-10-07 2 views
0

Я пытаюсь преобразовать несколько строк списков значений с разделителями-запятыми в текстовый файл с использованием perl.Как преобразовать строки в один файл, используя таблицу преобразования в другой файл с perl на Mac?

Первый файл выглядит следующим образом:

A:25, B:14, C:3 
A:25, E:5 
B:14, D:8, E:5 

второй файл с разделителями табуляции и выглядит следующим образом:

A:25 AS363 
B:14 SDD645 
C:3 KF8756 
D:8 LFK4523 
E:5 FSE523 

идеально я хотел бы выход быть разделенный запятыми, как исходный файл, просто все конвертируется, поэтому вывод должен выглядеть следующим образом:

AS363, SDD645, KF8756 
AS363, FSE523 
SDD645, LFK4523, FSE523 

Это i S мой код до сих пор:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $filename = $ARGV[0]; 
my $filename1 = $ARGV[1]; 

open(FILE, $filename); 

while (my $line = <FILE>){ 
      my @items = split /\s*,\s*/, $line; 
      foreach my $items (@items) { 
      #print "$items\n"; 
} 
} 
close FILE; 

open(FILE1, $filename1); 

while (my $line1 = <FILE1>) 

{ 

    my @ids = split /[\r\n\t]/,$line1; 
    #print "$ids[1]\n"; 

    if (my $items==$ids[1]){ 
    print "$ids[1]\n"; 
    } 
} 

close FILE1; 

, кажется, не в состоянии на данный момент, потому что $ пункты в первой части не глобальный ... если я продлить первый в то время как петля вокруг все, что не работает, либо, поэтому я не уверен, как это сделать. Я также отдельно как раз пытаюсь преобразовать обратно в запятую я предполагаю, я должен был бы использовать что-то вроде

join (",", ...) 

, но это, кажется, не работает, либо ... Любые советы? Благодаря!

+0

Вам нужен вывод для MATCH первого файла или просто LOOK, как первый файл? – fugu

+0

Я думаю, что ответ есть оба? Я хочу совместить первый файл со вторым файлом, а затем конвертировать обратно в формат первого файла – user1637359

ответ

2

Общий подход заключается в том, чтобы читать один файл (второй в этом случае) по строкам и использовать хеш для сохранения данных. В качестве ключа используются данные для поиска и как значение заменяемые данные. Позже прочитал другую также строка за строкой, разделить его на полях и для каждого сравнения, если существует в хэш:

#!/usr/bin/env perl 

use warnings; 
use strict; 

my %hash; 

die qq|Usage: perl $0 <file1> <file2>\n| unless @ARGV == 2; 

open my $fh1, '<', shift or die; 
open my $fh2, '<', shift or die; 

while (<$fh2>) { 
    s/\s+$//; 
    my @f = split; 
    next unless @f == 2; 
    $hash{ $f[0] } = $f[1]; 
} 

while (<$fh1>) { 
    s/\s+$//; 
    my @f = split /, /; 
    for my $elem (@f) { 
     if (defined $hash{ $elem }) { 
      $elem = $hash{ $elem }; 
     } 
    } 
    printf qq|%s\n|, join q|, |, @f; 
} 

Выполнить это нравится:

perl script.pl file1 file2 

Это дает:

AS363, SDD645, KF8756 
AS363, FSE523 
SDD645, LFK4523, FSE523 
+0

спасибо! это работает, но я собираюсь изучить это, чтобы понять, что это значит! – user1637359

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