sed或awk删除一个块

时间:2014-07-07 11:03:50

标签: bash shell awk sed

我的输入文件有像

这样的块
[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   

3 个答案:

答案 0 :(得分:2)

我是通过使用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

答案 1 :(得分:0)

$ 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

答案 2 :(得分:0)

这使每个块的最后一个实例不是第一个

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

这种方法的一个小问题是,由于字段分隔符是换行符,因此在文本之后行必须具有相同数量的空白,因为它被计为字段。
否则应该完美地工作:)

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

这也有效:)