我有一个由制表符分隔的各种列的文件。 我试图在perl中调用一个unix命令,但它总是给我一个错误
use strict;
use warnings;
system ("awk -F '\t' '{print $1}' file.txt > first_field.tmp");
答案 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();
}