Perl使用unix命令将文件拆分为列

时间:2014-03-20 23:56:47

标签: perl command-line tabs warnings

我有一个由制表符分隔的各种列的文件。 我试图在perl中调用一个unix命令,但它总是给我一个错误

use strict;
use warnings;


system ("awk -F '\t' '{print $1}' file.txt > first_field.tmp");

3 个答案:

答案 0 :(得分:3)

单引号system命令:

system(q{awk -F '\t' '{print $1}' file.txt > first_field.tmp});

或者不需要外部资源:

use strict;
use warnings;
use autodie;

{
    local @ARGV = 'file.txt';
    open my $fh, '>', 'first_field.tmp';
    while (<>) {
        chomp;
        my @F = split "\t";
        $fh->print("$F[0]\n");
    }
}

答案 1 :(得分:2)

您有一个以制表符分隔的值文件。那么在标签分隔模式下Text::CSV出了什么问题呢?无需为此类内容调用awk

答案 2 :(得分:1)

因为您在命令周围使用双引号" ",所以Perl正在尝试插入$1的值。你需要逃脱它:

system ("awk -F '\t' '{print \$1}' file.txt > first_field.tmp");

或者你可以使用'引号,它不插入:

system ('awk -F "\t" "{print $1}" file.txt > first_field.tmp');

...或qx

qx/awk -F '\t' '{print \$1}' file.txt > first_field.tmp/;

看到你是Perl的忠实粉丝,我建议你查看有关各种类型quotes and quote-like operators的文档。

显然这是Perl在早餐时吃的东西,所以如果你正在寻找原生的解决方案,我会建议使用@Miller发布的内容,或者其他百万种方法之一你可以做同样的事情的Perl。

使用@LeoNerd建议的Text::CSV包的替代版本:

use strict;
use warnings;

{
    use Text::CSV;

    my $csv = Text::CSV->new ( { sep_char => "\t" } )
                    or die "Cannot use CSV: ".Text::CSV->error_diag ();

    open my $fh, "<", "file.txt" or die "file.txt: $!";
    open my $out, ">", "first_field.tmp" or die "first_field.tmp: $!";
    while ( my $row = $csv->getline( $fh ) ) {
        $out->print("$row->[0]\n");
    }
    $csv->eof or $csv->error_diag();
}