2012-02-13 6 views
3

私は最初のフィールドは、私は、ファイルに以下の行を持っているIPv4のaddress.Forの一例である重複行を削除するためのソリューションが必要になります。のsed/awkの+正規表現重複行の最初のフィールドが一致した(IPアドレス)を削除

192.168.0.1/text1/text2 
192.168.0.18/text03/text7 
192.168.0.15/sometext/sometext 
192.168.0.1/text100/ntext 
192.168.0.23/othertext/sometext 

これまでのシナリオで一致したのはすべてIPアドレスです。私が知る限り、IPアドレスの正規表現は次のとおりです。

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 

解決策が1行で、できるだけ速いのは良いことです。

awk '!x[$1]++' FS="/" $PATH_TO_FILE 

EDIT:

+0

読者、「重複」とはどういう意味ですか?つまり、IPアドレスの一致について特に言及しているので、IPアドレスごとに1行しか保持しないように見えます。これは正しいです?もしそうでなければ、@ jcolladoのように、あなたはsortを使うべきです。 – ArjunShankar

+0

@ArjunShankar $ 1がIPアドレスである場合に限り、彼は重複した行を削除したいと思うかもしれないと思います。 "abcdefg"のような2つの(+)行がある場合、それらは削除されません。これは私の推測です。 – Kent

+0

@Kent:あなたは正しいかもしれません。私たちの混乱は基本的に発生します。例の*すべての*行はIPアドレスです。*一致するIP以外は実際の重複はありません。 – ArjunShankar

答えて

6

ファイルは行だけあなたが示す形式でが含まれている、いる場合、すなわち最初のフィールドはawkを1行で逃げることができ、常にIPアドレスであるこれは、ベースの重複を削除しますIPアドレスののみ。私はこの答えを書いたときにOPが望んでいたものなのかどうかはわかりません。

+0

+1は、元の順序も保持する最短のソリューションです。 – anubhava

+0

+1 OPが彼の「重複した線」をどのように定義しても、この解決策は彼のニーズに合わせて容易に拡張することができます。古典的な![$ n] ++の使用法は重複を取り除きます。 – Kent

+0

ソリューションは完璧です!まさに私が必要なもの!返信いただきありがとうございます。 – reader

0

あなたはこれを行うための一つの方法は、sortを使用している、元の順序を維持する必要がない場合:

sort -u <file> 
0

ArjunShankarが私のために働いたの驚異を掲載AWK。

私はフィールド1に複数のコピーを持っていたアイテムの膨大なリストを持っていた、とフィールド2に特別な連続番号は、私はそれぞれの固有のフィールドから1

を「最新」または最高のシーケンシャル番号を必要と私はsort -rnを使用して、最初のステップが書き​​込みであるため、それらを「最初のエントリ」の位置にプッシュしてから、最後の/最新のリストを取得するのではなく、次のエントリを比較する必要がありました。

ありがとうArjunShankar!

関連する問題