2017-02-22 35 views
0

我有這樣刪除重複的線路使用的sed

6bTxPVZ2aOXEQ5C [email protected] [01/Dec/2015:00:00:00 +0200] 
3bTxPVZ2dfXEQ5C [email protected] [01/Dec/2015:00:00:02 +0200] 
9bTxPVZ2dfXEQ6C [email protected] [01/Dec/2015:00:00:05 +0200] 

如何使用sed來刪除重複的行日誌文件,如果第二場電子郵件字段是一個重複前一行使用相同的電子郵件。

另外

這隻需要做,如果重複在彼此的3分鐘(使用第三日期/時間戳字段)內。

在上面的例子中,第三行將被刪除,除非它超過了最後的3分鐘。

+0

是sed你想使用的唯一工具嗎? awk會更適合 – Sundeep

+0

我在windows上,我可以使用awk嗎? –

回答

0

該腳本解決了部分查詢問題。 datos.dat文件包含您的代碼段,但修復電子郵件地址[email protected][email protected]。對於小的修復,你應該修復你的問題:

#! /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"