【问题标题】:Trying to delete first string where pattern is found and leave second string intact尝试删除找到模式的第一个字符串并保持第二个字符串完整
【发布时间】:2015-04-04 02:44:48
【问题描述】:

我有一个包含多行数据的文件,其中一些与记录末尾的日期字段重复。我希望能够扫描文件并保留最新记录。数据如下所示:

00xbdf0c9fd6;joe@easy.us.com;20141231 <- remove this one
00vbdf0c9fd6;joe@easy.us.com;20150403 <- keep this one (newer date)
00dndf0ca080;betty@easy.us.com;20141231 <-keep
00dbkf0ca292;jerry@easy.us.com;20141231 <-keep
0dbds0ca2f6;john@easy.us.com;20141231 <- remove
0dbds0ca2f6;john@easy.us.com;20150403 <- keep (newer date)

我尝试了 sed、awk、grep 的各种风格和组合,但我无法让它发挥作用。

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    为什么不根据地址和降序时间戳对文件进行排序?那么你需要做的就是保留第一个:

     <infile sort -t\; -k2,2 -k3r | awk -F\; '!h[$2]++'
    

    输出:

    00dndf0ca080;betty@easy.us.com;20141231               
    00dbkf0ca292;jerry@easy.us.com;20141231
    00vbdf0c9fd6;joe@easy.us.com;20150403
    0dbds0ca2f6;john@easy.us.com;20150403
    

    【讨论】:

    • 这似乎很好用,非常感谢!!我一直在尝试各种选择都无济于事..
    • 雷神,我遇到了一个问题。似乎当同一个人有多个条目并且在同一日期时,排序会丢弃其他条目而只保留一个。我怎样才能让它为同一个人保留同一日期的所有条目,并且只丢弃任何相同但日期较旧的条目?示例如下.. 0026cv6v03a9;dr@ust.test.com;20150406 (keep) 0026gvgv03a7;dr@ust.test.com;20150406 (keep) 0026gvgv03a7;dr@ust.test.com;20140403 (扔掉,同以前的记录但日期较旧)0026wv6w03a7;dr@ust.test.com;20150406(保留)0026wv6w03a7;dr@ust.test.com;20140403
    • @dr057:这从根本上改变了解决方案。我认为您应该将此作为一个新问题发布。
    【解决方案2】:

    试试这个:

    {
      split($0,parts,/;/)
      if (link[parts[2]] < parts[3]) {
        link[parts[2]] = parts[3]
      }
    }
    
    END {
      for (l in link) {
        print l,link[l]
      }
    }
    

    产生:

    sue@easy.us.com 20141231
    jerry@easy.us.com 20141231
    joe@easy.us.com 20150403
    betty@easy.us.com 20141231
    john@easy.us.com 20150403
    

    【讨论】:

    • 谢谢,但是有没有办法让它保持相同的格式并包含第一个字符串 00xbdf0c9fd6; ?所以它会像这样出现:00vbdf0c9fd6;joe@easy.us.com;20150403 00dndf0ca080;betty@easy.us.com;20141231 00dbkf0ca292;jerry@easy.us.com;20141231 0dbds0ca2f6;john@easy.us.com ;20150403 00dbdq0ca459;sue@easy.us.com;20141231
    • 这样,每一行都有一个字符串.. 00vbdf0c9fd6;joe@easy.us.com;20150403 00dndf0ca080;betty@easy.us.com;20141231 00dbkf0ca292;jerry@easy.us.com ;20141231 0dbds0ca2f6;john@easy.us.com;20150403 00dbdq0ca459;sue@easy.us.com;20141231
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 2020-02-14
    • 2011-06-24
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多