2014-09-28 64 views
1

我需要從日誌文件中刪除一些行。該文件包含一些包含9位數字的行,有時幾行。我需要用數字找到連續的行,並刪除每個這樣的組中除最後一行之外的每一行。使用awk刪除多個數字行

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 
+0

解決方案是否需要使用awk,或者可以使用常用的命令行工具嗎? – 2014-09-28 03:27:58

回答

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位數字的行時,我們會打印緩衝區中的任何內容,然後將其清空。

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

將整個文件加載到緩衝區中,刪除任何以與下一個相同的數字開頭的行。循環這個動作,直到有沒有更多的出現時打印出結果(只是刪除第一\ n添加的第一個動作)

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開始然後將其與存儲的最後一個錯誤編號一起打印,如果它不存儲錯誤。