Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl脚本中,我需要在文件中剪切一些多余的字段_Perl - Fatal编程技术网

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

在perl脚本中,我需要在文件中剪切一些多余的字段,perl,Perl,我是perl新手,想问你一个问题: 我有一个带有管道分隔符和32个字段的文件。我的客户想添加一些我不需要的字段。 我知道是UNIX,我会使用cut命令。 perl中是否有任何方法可以剪切这些新字段,以便脚本可以像处理旧格式的文件一样处理该文件 下面是我的代码: open (PRISM, "$infile") or die "Can't open $infile\n"; while ( <PRISM> ) { last if /^PRISMEXP/;

我是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}?)(.*?)$/;"    

问题是,这一行应该做什么?

这取决于处理文件的代码,您还没有显示

但让我们想象一下,它的作用如下:

my @fields = split /\|/, $input_line;
如果您只想保留前32个,请将其更改为

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

下面是一个过滤器,它将获取第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中找到该数组:


该正则表达式位于字符串中:

"
/^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"    
正则表达式什么也没做。它只是一个不起任何作用的字符串


你应该使用警告;严格使用;在你的每一个程序的顶端。使用警告;在这种情况下,您可能会收到这样一条信息:在…

的void上下文中无用地使用一个常量splice@fields, 32;你的意思是我必须打开文件,逐行读取,并拆分为32个字段,然后放入另一个文件,我将像以前一样处理它吗?@user2843135:一点也不。那么我就不明白了。一行将剪切整个文件?@user2843135:您必须在提取列的脚本中找到该行,你能给我们展示一些示例数据吗?你能给我们展示一些示例数据吗?你能给我们展示一些示例数据吗?你能给我们展示一些示例数据吗?0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-0 0 0 0 0 0 0 1241010 10 10 0 0 0 0 0 0 0 0 0你能给我们展示一些数据吗?你能给我们展示一些示例数据吗?0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| | 0 | 1 | 550.3648 | 32541 | | SUIG |非常感谢。我明白这是什么意思
"
/^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"