Perl 循环-提取记录的文本,直到下一条记录

Perl 循环-提取记录的文本,直到下一条记录,perl,bash,sed,awk,Perl,Bash,Sed,Awk,我的虚拟文件如下所示: >Tom text text text, year = 16 text text text Grades . . . . 10 Grades . . . . 9 >Ann text text text, year = 17 text Grades . . . . 10 Grades . . . . 10 Grades . . . . 9 我想: 对于每个名称分配值,提取年级行中的年份和

我的虚拟文件如下所示:

  >Tom
  text
  text text, year = 16 
  text 
  text
  text
  Grades . . . . 10
  Grades . . . . 9
  >Ann  
  text
  text text, year = 17 
  text 
  Grades . . . . 10
  Grades . . . . 10
  Grades . . . . 9 
我想:
对于每个名称分配值,提取年级行中的年份和最后一个数字。
对于这样的输出:

  1 Tom 
  1 year = 16
  1 10
  1 9 
  2 Ann
  2 year = 17
  2 10
  2 10
  2 9 

我不知道如何修改记录中的文本直到下一个记录。可以
grep'^>'-An
,但每个记录的行号都不同

假设实际文件中没有前导空格,下面是使用
awk
的一种方法:

awk 'sub(/^>/,"") { print ++i, $0 } /Grades/ { print i, $NF } /year =/ { print i, "year = ", $NF }' file
结果:

1 Tom
1 year =  16
1 10
1 9
2 Ann  
2 year =  17
2 10
2 10
2 9

当然
/Grades/{print i,$NF}
表示:在包含“Grades”的每一行上,打印
i
的值,后跟该行的最后一个字段
NF
是字段数的缩写,
$NF
是最后一个字段。那有用吗?是的,我知道了。是否有与第一个字段相等的字段(如
$NF
到最后一个字段)(除$1之外)?酷<代码>$1是第一个字段。你为什么还需要别的东西?如果需要两个副本,只需使用一个变量:
{x=$1}
perl -nE 'BEGIN{ $/ = ">"; $i=0} chomp; next unless length; $i++; say "$i $_" for /(.+)/, /(year\s*=.+)/, /grades.+?(\d+)/gi' file