2013-07-07 126 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