0

我正在尝试将 myu 数据中的一些特定列读取到我的输出文件中,我成功地一次读取一个 cloumn,但我想一次读取更多我感兴趣的列(我有我想要提取的列列表在一个单独的tex文件中)因为提取单个列并将它们加入一个单独的文件对我来说会变得很忙,这是我试图提取单个coulmn的代码,

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

open (DATA, "<file.txt") or die ("Unable to open file");
my $search_string = "IADC512444";

my $header = <DATA>;
my @header_titles = split /\t/, $header;
my $extract_col = 0;

for my $header_line (@header_titles) {
  last if $header_line =~ m/$search_string/;
  $extract_col++;
}

print "Extracting column $extract_col\n";

while ( my $row = <DATA> ) {
  last unless $row =~ /\S/;
  chomp $row;
  my @cells = split /\t/, $row;
  print "$cells[$extract_col] ";
}

有没有可能一次提取所有列,而不是只从我的文本文件中提取 IADC512444 到我的硬盘上的 outfile 中?请帮我解决这个问题,谢谢

4

1 回答 1

2

如果您需要将内容打印到磁盘上的文件,那么您应该以写入模式打开一个文件并写入它。此外,如果您想要更多列,您可以通过访问数组单元格中的相应元素来实现。在此示例中,我正在打印您正在打印的列以及第 1 列和第 2 列

open(OUT_FILE,">path_to_out_file") || die "cant open file...";
while ( my $row = <DATA> ) {
  last unless $row =~ /\S/;
  chomp $row;
  my @cells = split /\t/, $row;
  #print "$cells[$extract_col] ";
print OUT_FILE "$cells[$extract_col],$cells[1],$cells[2]\n";
}
close(OUT_FILE)

我已经稍微调整了代码以满足您的要求。在变量 req_hdr_string 中,您应该说出您需要的列名,用 分隔,因此它将被拆分并存储在哈希中。然后从标题我得到列的位置并只打印那些

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

open (DATA, "<h11.txt") or die ("Unable to open file");
my $req_hdr_string = "abc,ghi,mno,";
my %req_hdrs       = ();
my %extract_col    = ();
foreach(split /,/, $req_hdr_string)
{
    print "req hdr is:$_\n";
    $req_hdrs{$_} = $_;
}

my $index  = 0;
my $header = <DATA>;
chomp $header;
foreach (split /\t/, $header) 
{
    print "input is:|$_|\n";
    if(exists $req_hdrs{$_})
    {
        print "\treq index is:$index\n";
        $extract_col{$index} = 1;
    }
    $index++;
}

open(OUT_FILE,">out_file") || die "cant open file...";
while ( my $row = <DATA> ) 
{
    last unless $row =~ /\S/;
    chomp $row;
    my @cells = split /\t/, $row;
    foreach $index (sort keys%extract_col)
    {
        print OUT_FILE "$cells[$index],";
    }
    print OUT_FILE "\n";
}
close(OUT_FILE);
close(DATA);
于 2013-06-06T11:22:15.980 回答