正则表达式将值存储在perl中的变量中

时间:2013-05-29 22:15:47

标签: regex perl multiple-columns

我有一个文件,其数据看起来有点像我提供的示例。对于以名称开头的每一行,如果最后两列不为空,我需要在arry中存储1,其中大小为条目总数,如果是,则为0。请帮助我使用正则表达式,因为我似乎无法使其正常工作。

names.txt
#+++++++++++++++
#Data for 
#++++++++++++
# name1            1 Dist94085    11    10   
# name2            2 Dist94085   100   -9    
# name3            3 Dist94086    3    
# name4            4 Dist94085    
# name5            5 Dist94086    3    6    
# name6            6 Dist94086    3    6   

我用regex / ^ #name \ d + \ s + \ d + \ s + \ w + \ s + \ d + \ s + \ d + /。如何填充结果数组?我应该检查最后两列。如果两个列都有一个值,它应该存储1,否则为0.

2 个答案:

答案 0 :(得分:0)

“对于以名称开头的每一行,”

perl -lane 'next unless /^# name/;

“我需要存储......总条目数”

push @results, scalar @F;

“如果最后两列不为空,我需要存储... 1,如果它们是0,则需要存储。”

push @results, ["@F[4,5]" =~ /\S/ ? 1 : 0, scalar @F]

完成后,使用:

perl -MYAML=Dump -lane 'next unless /^# name/; push @results, ["@F[4,5]" =~ /\S/ ? 1 : 0, scalar @F]; END { print Dump \@results }' names.txt
---
-
  - 1
  - 6
-
  - 1
  - 6
-
  - 1
  - 5
-
  - 0
  - 4
-
  - 1
  - 6
-
  - 1
  - 6

当您理解这一点时,您可以根据实际数据改变它的味道。

请注意我写的内容与你对任务的英文描述的对应关系 - 我并没有尝试提出一个严格完全匹配数据的正则表达式。

答案 1 :(得分:0)

perl -lane 'if(/^# /){$F[4]=~m/[\-\+]*\d+/ && $F[5]=~m/[\-\+]*\d+/?push @a,1:push @a,0}END{print @a}' your_file

测试:

> cat temp
#+++++++++++++++
#Data for 
#++++++++++++
# name1            1 Dist94085    11    10   
# name2            2 Dist94085   100   -9    
# name3            3 Dist94086    3    
# name4            4 Dist94085    
# name5            5 Dist94086    3    6    
# name6            6 Dist94086    3    6
> perl -lane 'if(/^# /){$F[4]=~m/[\-\+]*\d+/ && $F[5]=~m/[\-\+]*\d+/?push @a,1:push @a,0}END{print @a}' temp
110011
>