当列匹配文本时,将整行复制到新文件

时间:2013-07-30 12:59:10

标签: perl

我正在写一个Perl脚本。如果指定列(此处为第13列)中的文本与某个文本(即“一个”或“两个”)匹配,则应将整行(所有列)复制到另一个文件中。我的输入是制表符分隔的.txt文件。

这是我到目前为止所做的:

my $table1 = $ARGV[0];
open(my $variants,$table1) || die "$! $table1";
open(my $out,'>',"filtered.txt") || die "Can't write new file: $!";

while(<$variants>){
    chomp;
    my @line=split(/\t/);  #split on tabs
    if (($line[12] =~ m/one/) || ($line[12] =~ m/two/)){
        print $out "$_";
    }   
}

由于我收到了“使用未初始化的值”错误,我想知道在此代码中需要更改的内容。

2 个答案:

答案 0 :(得分:3)

有什么问题?

perl -F'\t' -ane'print if $F[11]=~/one|two/' input > output

答案 1 :(得分:1)

这是一个应该使用Unix过滤器模型编写的程序的一个很好的例子。

#!/usr/bin/perl

use strict;
use warnings;

while (<>) {
  my @line = split /\t/;

  # Do you mean 12? That's the 13th field
  print if $line[12] =~ /one/ || $line[12] =~ /two/;
}

编写起来更简单,更易于理解。哦,更灵活(没有硬编码的文件名)。

这样称呼:

$ ./my_filter < input_file.txt > output_file.txt