具有复杂记录分隔符的gawk仅打印第一个匹配记录

时间:2016-05-05 16:09:05

标签: awk gawk

以下gawk命令只打印第一个匹配项,我需要输入文件中的所有匹配项。

.data 0x10008000

.word 5,9,32

 message1: 
    .asciiz "Select the temparature scale:<C or F><ENTER"
 message2: .asciiz "Type the desired temperature <ENTER>"
 message3: asciiz  "Temparature= "

.text

.globl main

main:
   li $v0,4
   la $a0,message1
   syscall

  li $v0,12
  syscall

  move $t0,$v0

  li $t1,70
  li$t2,67
 beq $t0,$t1,Farenheit
 beq $t0,$t2,Celcius

li $v0,10
 syscall


Farenheit:

     li $v0,4
     la $a0,message2
     syscall


     li $v0,6
     syscall

     lui $gp, 0x1000   #I put in register $gp the number 0x10008000,which                
     ori $gp, $gp,0x8000 # shows in the middle of address of static data

     lwc1 $f16, 0($gp)   

     cvt.s.w $f16, $f16



      lwc1 $f18, 4($gp)

     cvt.s.w $f18, $f18


      div.s $f20 , $f16,f$18

      lwc1 $f14, 8($gp)

      cvt.s.w $f14 $f14

      lwc1 $f12,$v0

      sub.s $f12,$f12,$f14

      mul.s $f0,$f20,$f12


       la $a0,message3
       li $v0,4
       syscall

      mov.s $f12,$f0
      li $v0,2
      syscall


       jr $ra


Celcius: 

     li $v0,4
     la $a0,message2
     syscall


     li $v0,6
     syscall

     lui $gp, 0x100
     ori $gp, $gp,0x8000

     lwc1 $f16, 0($gp)

     cvt.s.w $f16, $f16



      lwc1 $f18, 4($gp)

     cvt.s.w $f18, $f18


      div.s $f20 , $f18,f$16

      lwc1 $f14, 8($gp)

      cvt.s.w $f14 $f14

      lwc1 $f12,$v0

      mul.s $f12,$f12,$f20
      add.s $f0,$f12,$f14

       la $a0,message3
       li $v0,4
       syscall

      mov.s $f12,$f0
      li $v0,2
      syscall


       jr $ra

以下是输入数据格式化的模板:

 $ gawk 'BEGIN{RS="{Mon,Tue} Mar {21,22} [0-9]{2}:[0-9]{2}:[0-9]{2} 2016";FS ="\n";OFS="\n"} {print savedRT, $1, $2, $3, $4} {savedRT = RT}' iostat.20160321

Mon Mar 21 20:05:00 2016
 cpu
us sy wt id
4  2  0 94

是否有一个gawk的全球旗帜?我错过了什么?

1 个答案:

答案 0 :(得分:3)

您可以按如下方式解决此问题(需要GNU awk 1 ):

$ awk 'BEGIN {
    RS = "(Mon|Tue) Mar (21|22) [0-9]{2}:[0-9]{2}:[0-9]{2} 2016"
    FS = OFS = "\n"
}
NR > 1 { print savedRT $1, $2, $3, $4 }
{ savedRT = RT }' infile
Mon Mar 21 20:05:00 2016
 cpu
us sy wt id
4  2  0 94
Mon Mar 21 20:10:00 2016
 cpu
us sy wt id
3  2  0 94

需要进行以下更改:

  • 将记录分隔符中的{Mon,Tue}{21,22}更改为(Mon|Tue)(21|22)以进行正确的正则表达式更改
  • NR大于1时才开始打印;该文件以记录分隔符开头,因此第一条记录为空,我们不想打印一堆空行。
  • savedRT包含换行符,因此如果我们将其打印为print savedRT, $1,则会有一个换行符过多。更改为print savedRT $1会删除该额外换行符。

1 准确地说,GNU awk 4.0.0或更新版本,因为间隔表达式[0-9]{2}未被较旧的gawks识别,请参阅release notes。解决方法是改为使用[0-9][0-9]