如何在 Mac 上使用 Perl 转换另一个文件中的转换表来转换一个文件中的字符串



我正在尝试使用 perl 转换文本文件中多行逗号分隔的值列表。

第一个文件如下所示:

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

这是我到目前为止的代码:

#!/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 "$itemsn";
}
}
close FILE;
open(FILE1, $filename1);
while (my $line1 = <FILE1>) 
{
    my @ids = split /[rnt]/,$line1;
    #print "$ids[1]n";
    if (my $items==$ids[1]){
    print "$ids[1]n";
    }
}
close FILE1;

在这一点上似乎失败了,因为第一部分中$items不是全局的......如果我扩展第一个 while 循环的所有内容,那也不起作用,所以我不确定如何继续。我也一直在尝试转换回逗号分隔,我假设我必须使用类似的东西

join (",", ...)

但这似乎也不起作用...有什么建议吗?谢谢!

常见的方法是逐行读取一个文件(在本例中为第二个文件),并使用哈希保存数据。作为要查找的数据的关键,作为要替换的数据的值。稍后也逐行阅读另一个,将其拆分为字段,并为每个字段比较哈希中是否存在:

#!/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|%sn|, join q|, |, @f; 
}

像这样运行它:

perl script.pl file1 file2

这会产生:

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

最新更新