我有一个像这样的日志文件
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分钟。
答案 0 :(得分:0)
此脚本解决了部分查询问题。 datos.dat文件包含您的代码段,但修复电子邮件地址jamesbond.2015@business.my.emaildomain.com为jamesbond.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"