0

我有一个文件,其中的数据看起来有点像我提供的示例。对于以名称开头的每一行,如果最后两列不为空,我需要在一个数组中存储一个 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   

我想出了正则表达式 /^# name\d+\s+\d+\s+\w+\s+\d+\s+\d+/。如何填充我的结果数组?我应该检查最后两列。如果两列都有值,则应存储 1,否则存储 0。

4

2 回答 2

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

当您了解这一点时,您可以对其进行更改以适应您的实际数据。

请注意我写的内容与您对任务的英文描述是如何对应的——我并不是从试图提出一个严格和完全匹配数据的正则表达式开始的。

于 2013-05-30T01:59:57.607 回答
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
>
于 2013-05-30T05:38:35.453 回答