【问题标题】:perl remove last column of tab-delimited fileperl 删除制表符分隔文件的最后一列
【发布时间】:2016-07-23 02:10:21
【问题描述】:

我正在我的 perl 脚本中加载和打印制表符分隔的文件。但是,我的输入文件 ($table1) 的最后一列是空的,我不想在输出文件 ($table3) 中打印它。我应该如何以及在哪里执行此操作?在 'open' 之后还是在 'print $table3' 的末尾?

这是我的脚本的一部分(...表示对这个问题不重要的代码)

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

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
use Getopt::Long qw(GetOptions);;

...

open(my $table1,'<', $input) or die "$! - [$input]"; #input file 
open(my $table3, '+>', $output) || die ("Can't write new file: $!"); #output file

...

chomp( my @header_for_table1 = split /\t/, <$table1> );

print $table3 join "\t", @header_for_table1, "name1", "name2", "\n";

{
    no warnings 'uninitialized';
    while(<$table1>){
         chomp;
         my %row;
         @row{@header_for_table1} = split /\t/;
         print $table3 join ( "\t", @row{@header_for_table1},
                   @{ $lookup{ ... }
                        // [ "", "" ] }), "\n";
}
}

【问题讨论】:

    标签: perl


    【解决方案1】:

    您可以只使用pop @header_for_table1,它将删除最后一个标题,因此在哈希片中少存储一列。但我想“额外”列来自像这样的代码,它在join "\t", ..., "\n" 的参数列表中有换行符,所以最好只用s/\t?\n\z// 删除换行符之前的选项卡,而不是使用@987654324 @

    我建议您在join 参数周围加上一些括号,否则您将创建更多文件,并且每行末尾都有一个备用选项卡。这是对您展示的代码的重构,它使这一点和其他一些改进

    #! /usr/bin/perl
    
    use strict;
    use warnings;
    
    use Data::Dumper;
    local $Data::Dumper::Useqq = 1;
    use Getopt::Long qw(GetOptions);
    
    my ($input, $output);
    my %lookup;
    
    ...;
    
    open my $in_fh,  '<', $input  or die "$! - [$input]";
    
    ...;
    
    my @header = do {
        my $header = <$in_fh>;
        $header =~ s/\t?\n\z//;
        split /\t/, $header;
    };
    
    open my $out_fh, '>', $output or die "Can't write new file: $!";
    
    print $out_fh join("\t", @header, qw/ name1 name2 /), "\n";
    
    while ( <$in_fh> ) {
         s/\t?\n\z//;
    
         my @row = split /\t/;
    
         my $names = $lookup{ ... };
         my @names = $names ? @$names : ('', '');
    
         print $out_fh join("\t", @row, @names), "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2013-01-17
      相关资源
      最近更新 更多