在perl脚本中,我需要在文件中剪切一些过多的字段

时间:2015-03-05 13:52:43

标签: perl

我是perl的新手,想问你一个问题:
我有一个带管道分隔符的文件和32个字段。我的客户想要添加一些我不需要的字段。 我知道是UNIX我会使用cut命令 在perl中是否有任何方法可以删除这些新字段,以便脚本可以使用该文件,就像它是旧格式一样?

以下是我的代码:

open (PRISM, "$infile") or die "Can't open $infile\n";   
while ( <PRISM> ) {   
    last if /^PRISMEXP/;   
    next if /^(\s)*$/;  # skip blank lines   
    chomp;     
    "
    /^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"    

问题是,这条线应该怎么做?

3 个答案:

答案 0 :(得分:0)

这取决于处理文件的代码,但您尚未显示。

但是,让我们想象它会像下面这样做:

my @fields = split /\|/, $input_line;

如果您只想保留其中的前32个,请将其更改为

my @fields = (split /\|/, $input_line)[0 .. 31];

答案 1 :(得分:0)

这是一个过滤器,它将采用第2,第4,第6,第8,第11和第16列,并去除其余部分,然后将其重新换成以管道分隔的格式:

cat input.inp | perl -ne 'print join( q(|), (split /[|]/)[1,3,5,7,10,15])' > outfile.out

当然,您可以使用autosplit开关执行此操作,然后可以在@F中找到该数组:

cat input.inp | perl -F'|' -ne 'print join( q(|), @F[1,3,5,7,10,15])' > outfile.out

答案 2 :(得分:0)

正则表达式是一个字符串:

"
/^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"    

正则表达式没有做任何事情。它只是一个什么都不做的字符串。

您应该将use warnings; use strict;放在每个程序的顶部。在这种情况下,use warnings;会向您显示消息Useless use of a constant ("your regex") in void context at ...