使用awk删除多个数字行

时间:2014-09-28 03:16:47

标签: unix awk sed ksh

我需要从日志文件中删除一些行。该文件包含一些包含9位数字的行,有时连续几行。我需要找到带有数字的连续行,并删除每个这样的组中除最后一行之外的每一行。

408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
413128144
416192730
375139814
Error descrNo payment information available

处理完毕后,我也需要它:

408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
375139814
Error descrNo payment information available

如果可能的话,我还希望使用以下文本行加入每个数字,如下所示:

408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available

3 个答案:

答案 0 :(得分:2)

这是一种非常简单的方法:

$ cat f
408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
413128144
416192730
375139814
Error descrNo payment information available
$ cat f | awk '/^[0-9]{9}$/ { v=$0 } !/^[0-9]{9}$/ { print v " "$0; v="" } END { if (v) print v }'
408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available

基本上,如果我们遇到一个由9位数组成的行,我们将该行存储在缓冲区中。当我们遇到非9位数行时,我们打印缓冲区中的所有内容,然后将其清空。

答案 1 :(得分:1)

以下是awk的一种方式:

$ awk '$1=="Error"{print e,$0;next}{e=$1}' file
408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available

如果行以Error开头,则将其与存储的最后一个错误编号一起打印,如果它没有存储错误。

答案 2 :(得分:0)

sed -n 'h
$  {x
:cycle
   s/\(\n[0-9]* \)[^[:cntrl:]]*\1/\1/g
   t cycle
   s/.//p
   }' YourFile

将整个文件加载到缓冲区中,删除任何以与下一个文件相同的编号开头的行。循环此动作,直到不再出现,打印结果(只删除第一个动作添加的第一个\ n)