使用命令行删除文本中的重复字符串键

时间:2013-03-06 14:17:34

标签: regex command-line duplicates unique

我试图逐行删除一些重复的字符串。例如:

A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}
A {id: "x" p {id: "da" v: "i4"} on:faer"}
A {id: "y" p {id: "werw" v: "i4"} on:asee"}
A {id: "y" p {id: "werw" v: "i4"} on:asee"}

输出应该是没有重复A_id的输出,这意味着输出应该是:

A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}

我遇到的问题是我不知道如何排序并仅使用子字符串使其唯一。 我试着用:

cat input.txt | grep 'A\s\{id:\s\"[^;]*\sp\s\{id:' | sort -u > output.txt

但它不会删除重复的子字符串,只会删除与其他字符串完全相同的行。所以它就像只删除了一样:

A {id: "y" p {id: "werw" v: "i4"} on:asee"}

与最后两行完全相同,但未删除:

A {id: "y" p {id: "wse" v: "i4"} on:ue"}

具有重复ID但内容不同。

3 个答案:

答案 0 :(得分:2)

awk解决方案:

$ awk '!a[$3]++' file
A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}

从grep命令中梳理匹配:

$ awk '$1=="A" && $2=="{id:" && $4=="p" && $5=="{id:" && !a[$3]++' file
A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}

答案 1 :(得分:1)

问题是sort默认使用整个字符串作为键,因此它只会消除相同的行。

尝试更改

sort -u

sort -uk3,3

消除密钥为第3个字段的重复项。字段由空格分隔。

  

-k, - key = POS1 [,POS2]         在POS1开始一个键,在POS2(原点1)结束

     

POS是F [.C] [OPTS],其中F是字段编号,C是   场上的角色位置。 OPTS是一个或多个   单字母排序选项,覆盖全局排序   该键的选项。如果没有给出密钥,请使用整行   关键。

Reference

答案 2 :(得分:0)

Perl解决方案:

perl -ne 'if (/\{id: "([^"]+)"/ and not exists $h{$1}) { $h{$1}++; print }'

它存储在哈希中匹配的id,并且仅在id不在哈希值中时才打印。