0

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

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 但不同的内容。

4

3 回答 3

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"}
于 2013-03-06T14:31:58.333 回答
1

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

尝试改变

sort -u

sort -uk3,3

消除键是第三个字段的重复项。字段由空格分隔。

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

POS 是 F[.C][OPTS],其中 F 是字段编号,C 是字段中的字符位置。OPTS 是一个或多个单字母排序选项,它覆盖该键的全局排序选项。如果没有给出键,则使用整行作为键。

参考

于 2013-03-06T14:25:17.137 回答
0

Perl 解决方案:

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

它将匹配的 id 存储在哈希中,并且仅在 id 尚未在哈希中时打印。

于 2013-03-06T14:25:17.577 回答