2017-02-22 15 views
0

を使用してX分以内に、私は2番目のフィールドは、電子メールフィールドはの重複している場合、私は、重複行を削除するsedを使用することができますどのようにこの1つのフィールドに基づいて重複行を削除し、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] 

のようなログファイルを持っています前の行と同じ電子メールで

また

重複が互いの(3日付/時刻スタンプフィールドを使用して)3分以内である場合にのみ実行する必要があります。

上記の例では、最後の3分以上経過していない限り、3行目が削除されます。

+0

は、この目的に使用したい唯一のツールですか? awkがより適しているだろう – Sundeep

+0

私は窓にいる、私は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" 
関連する問題