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