perl one liner如果第二个字段匹配则将列添加到文件

时间:2016-09-04 20:19:51

标签: perl

我有一个文件,某些行有4个字段,有些行有3个字段,看起来像:

Chart.Line(Series1) |> Chart.Show // Chart 1
// do some work
Chart.Line(Series2) |> Chart.Show // display this in a second window
// continue executing the rest while the above windows are still open.

在行有3个字段的情况下,第二个字段匹配“number.longer number”,而如果行有4个字段,则第二个字段匹配“rsnumber”。在行有3个字段的情况下,我想在第三列中添加一个字段,该字段包含一个等于第二个字段的数字,用“。”分隔。例如,生成的文件如下所示:

1 rs17125090 63988904 ENSG00000142856
7 7.87455705 ENSG00000075303

我的perl one liner是:

1 rs17125090 63988904 ENSG00000142856
7 7.87455705 87455705 ENSG00000075303

但我得到一个空文件。有人可以解决这个问题/让我知道出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

编写单行程序时需要非常小心。许多正常的保护措施都没有到位,而且当没有布局时发现错误要容易得多

您的代码等同于此程序

for ( `cat file` ) {

    my @L = split;

    if ( $L[1] =~ m/^\d+\.\d+$/ ) {
        my @snp = split( /\./, $L[1] );
        splice( @L, 2, 0, $snp[1] );
    }
}

open OUT, ">file.new";
print OUT "@L\n";
close OUT;

你现在能看到问题所在吗?

这应该做你需要的事情

perl -anE 'splice @F, 2, 0, $F[1] =~ /\.(\d+)/; say "@F";' myfile