2013-07-07 67 views
-4

做一些操作一个文件的内容复制到一个新的文件,我有一个名为old.txt管道分隔的文件看起来像这样:我需要通过在Perl

Data1|Data2|Data3|Data4|Data5 
Data1|Data2|Data3|Data4|Data5 
Data1|Data2|Data3|Data4|Data5 

我需要将其内容复制到新的文件,命名为new.txt,但与第二列中删除:

Data1|Data3|Data4|Data5 
Data1|Data3|Data4|Data5 
Data1|Data3|Data4|Data5 

我该怎么办呢?

+3

我爱的Perl尽可能未来的家伙,但为什么不只是写'切-d“|” -f1,3-5 < old.txt > new.txt'? – ruakh

+0

以及上面提到的部分是我需要在perl脚本中完成的小任务,我已经为文件比较开发了这些脚本,但是我需要删除一个字段以供比较发生......这个剪切命令会在perl脚本 – Ajay

+0

这听起来像你正在以这种错误的方式去做;如果你想比较Perl内的文件,那么你不应该需要将临时修改的版本保存到磁盘。你应该能够在Perl空间内处理所有这些。但是要回答你的问题:是的,你可以通过编写'system'bash','-c','cut -d“|” -f1,3-5 < old.txt > new.txt''。 – ruakh

回答

2

这应该是非常简单的。

#!/usr/bin/perl 

use warnings; 
use strict; 

use autodie; 

open my $old_fh, "<", "old.txt"; 
open my $new_fh, ">", "new.txt"; 

while(my $line = <$old_fh>) { 
    # @data should have a more meaningful name 
    my @data = split /\|/, $line; 

    # remove the second element in the array. 
    splice @data, 1, 1; 
    print $new_fh join ' | ', @data; 
} 

close $old_fh; 
close $new_fh; 
3

当使用Text::CSV时,这是微不足道的。下面是一个示例脚本:

use strict; 
use warnings; 
use Text::CSV; 

my $csv = Text::CSV->new({ 
     binary => 1, 
     eol  => $/, 
     sep_char => "|", 
    }); 
open my $in, "<", "old.txt" or die $!; 

while (my $row = $csv->getline($in)) { 
    splice @$row, 1, 1;     # remove 2nd column 
    $csv->print(*STDOUT, $row);   # print the rest 
} 

输出:

Data1|Data3|Data4|Data5 
Data1|Data3|Data4|Data5 
Data1|Data3|Data4|Data5