使用sed在X分钟内删除基于一个字段的重复行

使用sed在X分钟内删除基于一个字段的重复行,sed,Sed,我有一个这样的日志文件 6bTxPVZ2aOXEQ5C jamesbond.2015@business.my.emaildomain.com [01/Dec/2015:00:00:00 +0200] 3bTxPVZ2dfXEQ5C kellytan.2016@business.my.emaildomain.com [01/Dec/2015:00:00:02 +0200] 9bTxPVZ2dfXEQ6C jamesbond.2016@business.my.emaildomain.com [

我有一个这样的日志文件

6bTxPVZ2aOXEQ5C jamesbond.2015@business.my.emaildomain.com [01/Dec/2015:00:00:00 +0200]  
3bTxPVZ2dfXEQ5C kellytan.2016@business.my.emaildomain.com [01/Dec/2015:00:00:02 +0200] 
9bTxPVZ2dfXEQ6C jamesbond.2016@business.my.emaildomain.com [01/Dec/2015:00:00:05 +0200] 
如果第二个字段“电子邮件”字段与具有相同电子邮件的前一行重复,如何使用sed删除重复行

仅当副本之间的距离在3分钟内(使用第3个日期/时间戳字段)时,才需要执行此操作


在上面的示例中,第三行将被删除,除非在最后一行之后超过3分钟

此脚本解决部分查询。datos.dat文件包含您的代码段,但修复了电子邮件地址jamesbond。2015@business.my.emaildomain.com我是詹姆斯邦德。2016@business.my.emaildomain.com. 对于次要修复,您应该修复您的问题:

#! /bin/sh

OIFS="$IFS"
IFS=$'\n'

month_to_number()
{
    local month=$1
    case $month in
    Jan) echo 01 ;;
    Feb) echo 02 ;;
    Mar) echo 03 ;;
    Apr) echo 04 ;;
    May) echo 05 ;;
    Jun) echo 06 ;;
    Jul) echo 07 ;;
    Ago) echo 08 ;;
    Sep) echo 09 ;;
    Oct) echo 10 ;;
    Nov) echo 11 ;;
    Dec) echo 12 ;;
    esac
}

get_utc()
{
    #BAD_DATE="01/Dec/2015:00:00:05"
    local INPUT=$1

    DAY=$(echo $INPUT | cut -f 1 -d "/")
    TXT_MONTH=$(echo $INPUT | cut -f 2 -d "/")
    MONTH=$(month_to_number $TXT_MONTH)
    YEAR=$(echo $INPUT | cut -f 3 -d "/" | cut -f 1 -d ":")
    HOUR=$(echo $INPUT | cut -f 2 -d ":")
    MIN=$(echo $INPUT | cut -f 3 -d ":")
    SEC=$(echo $INPUT | cut -f 4 -d ":")

    #GOOD_DATE="2015-12-01 00:00:05"
    GOOD_DATE="$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC"

    UTC=$(date -d $GOOD_DATE +%s)
    echo $UTC
}

for EMAIL in $(cat datos.dat | cut -f 2 -d " " | sort | uniq)
do
    FOUND_BAD_DATE=""
    FOUND_UTC=""
    for ROW in $(cat datos.dat | grep $EMAIL)
    do
        FIRST_COL=$(echo $ROW | cut -f 1 -d " ")
        BAD_DATE=$(echo $ROW| cut -f 3 -d " " | sed "s/\[//")
        UTC=$(get_utc $BAD_DATE)

        if [ "$FOUND_UTC" == "" ]; then
            FOUND_BAD_DATE="$BAD_DATE"
            FOUND_UTC=$UTC
            continue
        fi

        if [ $FOUND_UTC -lt $UTC ]; then
            FOUND_BAD_DATE="$BAD_DATE"
            FOUND_UTC=$UTC
        fi

    done
    echo "$FIRST_COL $EMAIL [$FOUND_BAD_DATE]"
done

IFS="$OIFS"

sed是您要用于此目的的唯一工具吗?awk更适合我在windows上,我可以使用awk吗?