【问题标题】:Remove duplicate lines with a twist gnuwin32使用扭曲 gnuwin32 删除重复的行
【发布时间】:2017-03-02 09:59:24
【问题描述】:

好的,所以我想删除重复的行,但它比这更复杂..

我有一个名为 users.txt 的文件,文件示例是:

users:email@email.com
users1:email@email.com

现在由于我的系统中的一个错误,人们可以使用与其他人相同的电子邮件进行注册,所以如果线路多次使用相同的电子邮件,我想删除,问题示例:

user:display:email@email.com
user2:email@email.com
user3:email@email.com
user4:email@email.com

注意用户、用户 2、用户 3、用户 4 都拥有相同的电子邮件。我想删除用户 2、用户 3、用户 4,但保留用户 .. 反之亦然(第一个被请求提取)删除任何其他包含相同电子邮件的行..

如果

email@email.com is in 20 lines remove 19
spam@spam.com is in 555 lines remove 554

还有第四个..

【问题讨论】:

  • 使用电子邮件作为awk 数组中的索引。在处理每一行时,如果电子邮件不在数组中,则打印该行并将其添加到数组中。
  • 你能解释一下“第一个被要求取走”是什么意思吗?您选择保留哪条线的标准到底是什么?按字母顺序排列的第一个用户名?第一个出现在文件中?

标签: linux bash awk gawk gnuwin32


【解决方案1】:

这可以通过awk来完成:

awk '!a["user:display:email@email.com"]++' filename

++ 表示,转为 True。所以,在它匹配打印结果之后。

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

示例:

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

现在!

$ awk '!a["user:display:email@email.com"]++' filename
user:display:email@email.com

所以,现在你只需要过滤掉awk 的内容。不知道您的文件有多大,至少要计算我会执行以下操作的条目:

$ grep -o 'email@email.com' filename | wc -l
4

如果您知道awk 上的内容,只需将其写入一个新文件 - 只是为了保存。

awk '!a["user:display:email@email.com"]++' filename >> new_filename

【讨论】:

    【解决方案2】:

    awk 来救援!

    $ awk -F: '!a[$NF]++' file 
    
    user:display:email@email.com
    

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2017-04-02
      • 2021-05-17
      相关资源
      最近更新 更多