2017-03-01 41 views
0

好了,所以我想删除重复的行,但它是比这更复杂一点..与扭曲删除重复行的GnuWin32

我有一个user.txt文件,命名,例如文件是:

users:[email protected] 
users1:[email protected] 

现在由于我的系统的人的错误都能够使用相同的电子邮件作为别人注册了,所以我想,如果行有相同的电子邮件删除不止一次,例如问题:

user:display:[email protected] 
user2:[email protected] 
user3:[email protected] 
user4:[email protected] 

公告浩W用户,用户2,用户3,用户4都有相同的电子邮件..以及我想删除用户2,用户3,用户4但保持用户..反之亦然(第一个被请求接收)删除任何其他行包含相同的电子邮件..

所以如果

[email protected] is in 20 lines remove 19 
[email protected] is in 555 lines remove 554 

等..第四

+1

使用电子邮件作为'awk'数组中的索引。在处理每一行时,如果电子邮件不在数组中,请打印该行并将其添加到数组中。 – Barmar

+0

查看http://stackoverflow.com/questions/2604088/awk-remove-line-if-field-is-duplicate – Barmar

+0

你能解释一下你的意思吗?“第一个被请求接受”?你的标准究竟是选择哪条线?按字母顺序排列第一个用户名?第一个出现在文件中? – Fred

回答

0

这可以用awk完成:

awk '!a["user:display:[email protected]"]++' filename 

++手段,转向真实。所以,它匹配打印结果后。

!在这种情况下使用,以扭转这种情况。所以比赛结束后,它变成了假。 (如不匹配后打印)

例如:

$ awk 'a["user:display:[email protected]"]++' filename 
user2:[email protected] 
user3:[email protected] 
user4:[email protected] 
line_random1 
linerandom_2_ 

现在用!

$ awk '!a["user:display:[email protected]"]++' filename 
user:display:[email protected] 

所以,现在你只需要过滤掉什么awk上。不知道你的文件有多大,算至少我会做以下的条目:

$ grep -o '[email protected]' filename | wc -l 
4 

如果你知道该怎么awk上,只是把它写一个新的文件 - 只是为了保存。

awk '!a["user:display:[email protected]"]++' filename >> new_filename