我的输入文件有像
这样的块[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
答案 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
这也有效:)