Awk 尝试删除找到模式的第一个字符串,并保留第二个字符串不变

Awk 尝试删除找到模式的第一个字符串,并保留第二个字符串不变,awk,sed,Awk,Sed,我有一个包含多行数据的文件,其中一些是重复的,记录末尾有日期字段。我希望能够扫描文件并保留最新记录。以下是数据的样子: 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 00dbkf0ca

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

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)
00xbdf0c9fd6;joe@easy.us.com;20141231试试这个:

{
  split($0,parts,/;/)
  if (link[parts[2]] < parts[3]) {
    link[parts[2]] = parts[3]
  }
}

END {
  for (l in link) {
    print l,link[l]
  }
}

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

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

Thx,但有没有办法保持格式不变并包含第一个字符串00xbdf0c9fd6?结果是:00vbdf0c9fd6;joe@easy.us.com;2015040300DNDF0CA080;betty@easy.us.com;2014123100DBKF0CA292;jerry@easy.us.com;20141231 0dbds0ca2f6;john@easy.us.com;2015040300DBDQ0CA459;sue@easy.us.com;20141231像这样,每行上有一个字符串。。00vbdf0c9fd6;joe@easy.us.com;2015040300DNDF0CA080;betty@easy.us.com;2014123100DBKF0CA292;jerry@easy.us.com;20141231 0dbds0ca2f6;john@easy.us.com;2015040300DBDQ0CA459;sue@easy.us.com;20141231这似乎很有效,非常感谢!!我一直在尝试各种各样的选择,但都无济于事托尔,我遇到了一个问题。。似乎当同一个人有多个条目且在同一日期时,排序会丢弃其他条目,只保留一个条目。我怎么能让它让同一个人的所有条目保持在同一个日期,而只丢弃任何相同但日期较旧的条目?下面是一个例子。。0026cv6v03a9;dr@ust.test.com;20150406(保留)0026GV03A7;dr@ust.test.com;20150406(保留)0026GV03A7;dr@ust.test.com;20140403(丢弃,与先前记录相同,但日期较旧)0026wv6w03a7;dr@ust.test.com;20150406(保留)0026wv6w03a7;dr@ust.test.com;20140403@dr057:这从根本上改变了解决方案。我想你应该把这个问题作为一个新问题发布。
 <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