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"}

最後の 2 行はすべて同じですが、削除されていません。

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

キーが 3 番目のフィールドである重複を排除します。フィールドは空白で区切られます。

-k, --key=POS1[,POS2] POS1 でキーを開始し、POS2 で終了します (オリジン 1)

POS は F[.C][OPTS] で、F はフィールド番号、C はフィールド内の文字位置です。OPTS は 1 つ以上の 1 文字の順序付けオプションであり、そのキーのグローバルな順序付けオプションをオーバーライドします。キーが指定されていない場合は、行全体をキーとして使用します。

参照

于 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 に答える