Perl - 打印列的第一个字母

时间:2016-02-25 07:19:29

标签: perl

我试图打印输入文件的第2列的第一个字母以及其他感兴趣的列。我不确定为什么从Matching first letter of word改编的以下脚本会让我使用未初始化的值$ columns [2]'警告。

输入文件示例:

ATOM      1  CAY GLY X   1      -0.124   0.401  -0.153  1.00  2.67      PEP   
ATOM      2  HY1 GLY X   1      -0.648   0.043  -1.064  1.00  0.00      PEP   
ATOM      3  HY2 GLY X   1      -0.208   1.509  -0.145  1.00  0.00      PEP 

输出文件示例:

   1  C  -0.124   0.401  -0.153  1.00  2.67       
   2  H  -0.648   0.043  -1.064  1.00  0.00        
   3  H  -0.208   1.509  -0.145  1.00  0.00

脚本

open (my $input_fh, "<", $filename) or die $!;
    while (my $data = <$input_fh>) {
            chomp $data;
            my @columns = split(/\t/, $data);
            my ($firstletter) = ($columns[2] =~ m/^\d+(\w)/);
        if (/CAY/../HT2/) 
        print $output_fh join ("\t", $columns[1], $firstletter, $columns[6], $columns[7], $columns[8]), "\n";
            }

更新出于某种原因,由于if (/CAY/../HT2/)语句而发生了警告 - 但由于输入文件相同,因此我并不需要这种情况。此外,由于第2列中没有数字,因此使用/^(\w)/正则表达式更为合适。

4 个答案:

答案 0 :(得分:1)

尝试调整分割后得到的内容:

my @columns = split(/\t/, $data);
local $" = "\n"; print "$data\nSplitted into:\n@columns";

猜猜你的文件有双\ t字符。我的意思是你可能有: ATOM\t\t1 CAY GLY X...所以第二列是undef

答案 1 :(得分:1)

是否有一些特殊原因必须拆分标签?正确地在任意文本文件中获取各种空白区域可能是挑剔的。如果没有必要,它似乎完全适合于拆分(任意)空间,然后抓住第一个字母

my @cols = split '\s+', $data;
my ($firstletter) = $cols[1] =~ m/^(\w)/;

我不确定其余的是什么,但您可以轻松地获取所需的列。

答案 2 :(得分:0)

听起来像是给出警告的代码不是你所展示的,而是像

那样
($columns[2]) = ($columns[2] =~ m/^\d+(\w)/);

并且您正在收到警告,因为正则表达式因未找到数字而失败。也许你的意思是\d*

答案 3 :(得分:-3)

对我来说,也许我想使用cut命令和管道,然后使用split命令获取你想要的确切信息。