1

IP アドレスとペアになったデータを含むリストがあり、IP アドレスを一度だけ表示したいので、順序を変更したくありません。

192.168.0.100 フレッドは幸せです
192.168.0.100 フレッドはパイが好き
192.168.0.100 パイいいですね
192.168.0.110 ケーキのようなトム
192.168.0.110 ケーキいいですね
192.168.0.110 パイの方がいい
192.168.0.112 レタスのような請求書
192.168.0.112 レタスは体にいい
192.168.0.112 ケーキとパイはレタスより美味しい

私がやりたいことは、重複する IP アドレスを削除するだけで、すべてをまったく同じままにすることです。

こんな感じにしたい

192.168.0.100 フレッドは幸せです
                 フレッドはパイが好き
                 パイがうまい
192.168.0.110 ケーキのようなトム
                 ケーキはいい
                 パイの方がいい
192.168.0.112 レタスのような請求書
                 レタスは体にいい
                 ケーキとパイはレタスより美味しい

重複する単語には触れたくないし、順序を変更することもできません

助けていただければありがたいです

4

5 に答える 5

2

これは、ファイル内のスペーシングや RE メタキャラクタの種類に関係なく機能します。

$ awk '
{ key = $1 }
key == prev { sub(/[^[:space:]]+/,sprintf("%*s",length(key),"")) }
{ prev = key; print }
' file
192.168.0.100    fred is happy
                 fred likes pie
                 pie is good
192.168.0.110    tom like cake
                 cake is good
                 pie is better
192.168.0.112    bill like lettuce
                 lettuce is good for you
                 cake and pie are better tasting than lettuce

RE コンテキストで $1 を使用するソリューションには注意してください。IP アドレスの「.」は「任意の文字」を意味する RE メタ文字であるため、一部のサンプル データでは機能する可能性がありますが、他の入力を指定すると誤った一致が得られる可能性があります。

于 2013-09-14T14:45:54.210 に答える
1

ip とテキストの間の区切り文字は だと思いますtab。このワンライナーはあなたのために働くはずです:

awk -F'\t' -v OFS='\t' 'a[$1]{gsub(/./," ",$1);print;next}{a[$1]=1}7' file

ファイルでテストします。

kent$  awk -F'\t' -v OFS='\t' 'a[$1]{gsub(/./," ",$1);print;next}{a[$1]=1}7' f
192.168.0.100   fred is happy
                fred likes pie
                pie is good
192.168.0.110   tom like cake
                cake is good
                pie is better
192.168.0.112   bill like lettuce
                lettuce is good for you
                cake and pie are better tasting than lettuce
于 2013-09-13T20:01:18.583 に答える
1

もう1つ:

awk 'A[$1]++{s=$1; gsub(/./,FS,s); sub($1,s)}1' file
于 2013-09-14T15:38:04.793 に答える
1

awk の使用:

awk 'BEGIN{FS=OFS="    "}{t=$1;if(t in a){gsub(/./," ",$1);a[t]=a[t]RS$0}else{a[t]=$0}}END{for(i in a)print a[i]}' file

出力:

192.168.0.100    fred is happy
                 fred likes pie
                 pie is good
192.168.0.110    tom like cake
                 cake is good
                 pie is better
192.168.0.112    bill like lettuce
                 lettuce is good for you
                 cake and pie are better tasting than lettuce
于 2013-09-13T20:04:54.477 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r '1{:a;p;h;s/\s.*//;s/./ /g;H;d};G;s/^(\S+)(\s.*)\n\1.*\n(.*)/\3\2/;t;s/\n.*//;ba' file

最初のレコードとキーが変更されたレコードを出力し、キーとその補数をホールド スペースのスペースに格納します。後続のレコードについて、保存されたキーを現在のキーと比較し、一致するものについては、現在のキーをスペースの補数に置き換えます。一致しないキーについては、保存されているキーを削除して補完し、最初から繰り返します。

于 2013-09-14T10:45:26.763 に答える