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 和 text 之间的分隔符是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

使用 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 回答
1

多一个:

awk 'A[$1]++{s=$1; gsub(/./,FS,s); sub($1,s)}1' file
于 2013-09-14T15:38:04.793 回答
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 回答