簡體   English   中英

sed或awk刪除塊

[英]sed or awk to delete a block

我的輸入文件有像

[abc]  
para1=123  
para2=456  
para3=111  

[pqr]  
para1=333    
para2=765    
para3=1345    

[xyz]    
para1=888    
para2=236    
para3=964    

[pqr]    
para1=tyu    
para2=ghj     
para3=ghjk     

[xyz]    
para1=qwe    
para2=asd    
para3=zxc    

現在,我需要使用sed或awk刪除重復的塊。 必須刪除文件頂部的第一個塊。 例如:在上述情況下,我們得到的輸出如下

[abc]  
para1=123  
para2=456  
para3=111  

[pqr]    
para1=tyu    
para2=ghj     
para3=ghjk     

[xyz]    
para1=qwe    
para2=asd    
para3=zxc   

我確實是通過使用awk獲得的(不確定您是否忘記了abc塊)

awk '!a[$1]++' RS= ORS="\n\n" file
[abc]
para1=123
para2=456
para3=111

[pqr]
para1=333
para2=765
para3=1345

[xyz]
para1=888
para2=236
para3=964
$ cat tst.awk
BEGIN{ RS=""; ORS="\n\n" }
!seen[$1]++ { keys[++numKeys] = $1 }
{ rec[$1] = $0 }
END {
    for (k=1; k<=numKeys; k++) {
        print rec[keys[k]]
    }
}

$ awk -f tst.awk file
[abc]
para1=123
para2=456
para3=111

[pqr]
para1=tyu
para2=ghj
para3=ghjk

[xyz]
para1=qwe
para2=asd
para3=zxc

這將保留每個塊的最后一個實例,而不是第一個

 tac file | awk -F"\n" '!x[$NF]++' RS= ORS="\n\n"  |  tac

這種方法的一個小問題是,由於字段分隔符是換行符,因此文本后面的行必須具有相同的空格量,因為該行被視為字段。
否則應該完美工作:)

 tac file | awk '!x[$(NF-1)]++' RS= ORS="\n\n"  |  tac

這也有效:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM