Awk 错误时打印上一条实际记录和下一条记录

Awk 错误时打印上一条实际记录和下一条记录,awk,Awk,在下面的示例中,在第2列中。值增加,则目的是获取不按增加顺序排列的记录并打印(上一个-错误-下一个) 文件 2343 290232732 2343 290232738 2349 290202757 2342 290232758 2343 290232813 2341 291063213 2343 291043555 2345 291063609 2343 291063622 2343 291063637 2341 291053637

在下面的示例中,在第2列中。值增加,则目的是获取不按增加顺序排列的记录并打印(上一个-错误-下一个)

文件

2343 290232732   
2343 290232738   
2349 290202757   
2342 290232758   
2343 290232813   
2341 291063213   
2343 291043555   
2345 291063609   
2343 291063622   
2343 291063637   
2341 291053637   
2343 291063702   
2343 291063707   
2343 291063712   
2343 291063751
我试过了

awk '{                                                                                                                               
         if(substr($0,6,9) < prev -1)                                                                                                                        
         {printf ("** ERROR ** %4d --> %4d --> %4d\n",prv2, prev, substr($0,6,9)) } ; prv2 = prev; prev = substr($0,6,9)}'  file
所需输出

** ERROR ** 290232732 --> 290232738 --> 290202757
** ERROR ** 290232813 --> 291063213 --> 291043555
** ERROR ** 291063622 --> 291063637 --> 291053637
** ERROR ** 290232738 --> 290202757 --> 290232758
** ERROR ** 291063213 --> 291043555 --> 291063609
** ERROR ** 291063637 --> 291053637 --> 291063702
提前感谢

您可以尝试此awk:

awk '
  f {                           # if flag print ERROR
    p = p FS "-->" FS $2
    print "** ERROR **" FS p
    split ( p , a )             # keep $2 of previous line in p
    p = a[3]                    # this way if it is in error you can catch it
    f = 0                       # remove flag
  }
  $2 > p {                      # $2 is ok keep it
    p = $2
    next
  }
  {
    p = p FS "-->" FS $2        # $2 is not ok
    f = 1                       # prepare to print
  }
  END {
    if ( f )                    # the last line is in error
      print "** ERROR **" FS p  # print it
  }
' file

我不认为有任何方法可以知道最后一个错误是什么时候,而不需要至少检查一次整个文件。jas,tks,在这种情况下,将足以获得所需的错误。在ctac中,代码可以工作,但总是打印文件的最后一行?此外,如果之前的值与实际值相同,则视为错误。。?。。你能修好它吗。tk如果上一个值与实际值相同,则不是递增顺序。您可以将行$2>p更改为$2>=p总是打印文件的最后一行吗?对不起,我不明白$仅当最后一行出错或前一行出错时,才会打印最后一行的第2行。嗨,catc,tks有关代码和解释,对于我的文件中的“始终打印文件的最后一行”很抱歉,我在文件末尾有两行额外的空行,这就是代码打印它的原因。。但是现在没事了。很多