【问题标题】:Perl hash : printing file columns based on key of another filePerl 哈希:根据另一个文件的键打印文件列
【发布时间】:2017-02-10 04:47:32
【问题描述】:

我是 perl 的新手,在 perl 中发现以下情况和哈希概念很难处理。我找到了一些输入来处理这种情况,但没有安装 Text:CSV 模块。

#/usr/bin/perl -w
use strict;
use warning;
use Data::Dumper;

my $INFILE_01 = "FILE_01.txt";
my $INFILE_02 = "FILE_02.txt";

open INFILE02, "< $INFILE_02" or die "$0 : Failed to open input file $INFILE_02 : $! \n";
# Format of INFILE02 - Tab Delimited
DEVELOMENT_TEST BUGID_TS57  TestID
DEVELOMENT_UAT  BUGID_TS57  TestID
DEVELOMENT_PROD BUGID_TS57  TestID
DEVELOMENT_REG  BUGID_TS57  TestID
DEVELOMENT_TEST BUGID_TS57  TestID
DEVELOMENT_TEST BUGID_TS57  TestID
DEVELOMENT_UAT  BUGID_TS57  TestID
my %INFILE02;

while (my $line = <INFILE02>) {
    # Skipping if the line is empty or a comment
    next if ( $line =~ /^\s*$/ );
    next if ( $line =~ /^#\s*/ );
    chomo $line;

    if ($line = ~ /MOBILE_DEV/) { 
        my ($colum1, $column2, undef) = split /\t/, $line;
        $INFILE02{$colum1} = $colum2;
    }

}
close $INFILE02 or die "$0 : Failed to close input file $INFILE02 : $! \n";
print Dumper \%INFILE02;

# Output of %INFILE02
$VAR1 = {
        'DEVELOMENT_TEST' => 'BUGID_TS57',
        'DEVELOMENT_UAT'  => 'BUGID_TS57',
        'DEVELOMENT_PROD' => 'BUGID_TS57',
        'DEVELOMENT_REG'  => 'BUGID_TS57'
}

现在,从上面的 INFILE02 哈希输出中,我需要将键 DEVELOMENT_TEST、DEVELOMENT_UAT、DEVELOMENT_PROD、DEVELOMENT_REG 与文件 INFILE01 的每一行一一匹配。

对于 Ex 如果键 DEVELOMENT_TEST 存在于 INFILE01 的任何行上,则将 column1 、 INFILE01 的第 3 列和 INFILE02 的所有列打印到输出文件。

我需要对 %INFILE02 的所有键重复此操作。

#Format of INFILE001 - Tab Delimited
119736    PRODUCTTESTING  DEVELOMENT_TEST
448094    PRODUCTTESTING  DEVELOMENT_TEST
206893    PRODUCTTESTING  DEVELOMENT_TEST
333743    PRODUCTTESTING  DEVELOMENT_TEST
172534    PRODUCTTESTING  DEVELOMENT_PROD
785275    PRODUCTTESTING  DEVELOMENT_PROD
995932    PRODUCTTESTING  DEVELOMENT_PROD
223488    PRODUCTTESTING  DEVELOMENT_TEST
433512    PRODUCTTESTING  DEVELOMENT_TEST
640802    PRODUCTTESTING  DEVELOMENT_PROD
403866    PRODUCTTESTING  DEVELOMENT_UAT
828788    PRODUCTTESTING  DEVELOMENT_UAT
751490    PRODUCTTESTING  DEVELOMENT_UAT
972562    PRODUCTTESTING  DEVELOMENT_UAT
367541    PRODUCTTESTING  DEVELOMENT_REG
481360    PRODUCTTESTING  DEVELOMENT_REG
920232    PRODUCTTESTING  DEVELOMENT_UAT

所需的输出应如下所示:

119736  DEVELOMENT_TEST BUGID_TS57  TestID
448094  DEVELOMENT_TEST BUGID_TS57  TestID
206893  DEVELOMENT_TEST BUGID_TS57  TestID
333743  DEVELOMENT_TEST BUGID_TS57  TestID
223488  DEVELOMENT_TEST BUGID_TS57  TestID
433512  DEVELOMENT_TEST BUGID_TS57  TestID
172534  DEVELOMENT_PROD BUGID_TS57  TestID
785275  DEVELOMENT_PROD BUGID_TS57  TestID
995932  DEVELOMENT_PROD BUGID_TS57  TestID
640802  DEVELOMENT_PROD BUGID_TS57  TestID
403866  DEVELOMENT_UAT  BUGID_TS57  TestID
828788  DEVELOMENT_UAT  BUGID_TS57  TestID
751490  DEVELOMENT_UAT  BUGID_TS57  TestID
972562  DEVELOMENT_UAT  BUGID_TS57  TestID
920232  DEVELOMENT_UAT  BUGID_TS57  TestID
367541  DEVELOMENT_REG  BUGID_TS57  TestID
481360  DEVELOMENT_REG  BUGID_TS57  TestID

请提供相同的建议。提前致谢。

【问题讨论】:

  • 我没有理解将我的键与另一个文件的值进行比较的概念。
  • 请编辑您的问题以使其更清楚。该代码与您的数据无关,例如,我在数据中看不到硬编码的MOBILE_DEV 字符串。此外,chomo 应该是 chomp。等等。

标签: perl


【解决方案1】:

如下所示,第一个参数是文件一,第二个参数是文件二:

#!/usr/bin/perl

use strict;

my %hash=undef;
open(my $fh,$ARGV[0]);
while (<$fh>) {
    my @fields=split(/\s+/);
    $hash{$fields[0]}=1;
}
close($fh);

open(my $fh,$ARGV[1]);
while (<$fh>) {
    for my $key (keys %hash) {
        if ($key && /$key/) {
            print "$_";
        }
    }
}
close($fh);

【讨论】:

  • 我很确定my %hash=undef 不会像您认为的那样做。将use warnings 添加到代码中会显示问题。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2020-02-12
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多