[英]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.