2017-12-09 17 views
0

cus.txtファイルからいくつかのデータをフィルタリングするために、いくつかのLINUXコードを開発しています。以下、私はあなたがすべてのは、4番目の列に単語を「拒否」満たしている場合 が、それは名前欄に名前を確認し、それを次の「合格」の行をフィルタする必要があり、である必要がある。ここLINUXコマンドで特定の期間にデータ行を取得します。

12/3/2017 13:25:16 SAM  reject 
12/3/2017 13:25:26 NEEL  pass 
12/3/2017 13:25:58 SAM  pass 
12/3/2017 14:55:11 COOK  pass 
12/13/2017 21:25:45 ANDRUE pass 
12/15/2017 23:46:31 FLINTOF pass 
12/19/2017 16:25:51 KEVIN pass 
12/20/2017 13:15:35 JHON  reject 
12/20/2017 13:15:25 ADEM  pass 
12/20/2017 13:15:51 JHON  pass 
12/22/2017 15:39:09 KEVIN pass 
12/25/2017 19:25:28 SIMON reject 
12/25/2017 19:25:31 JHON  pass 
12/25/2017 19:25:38 COOK  pass 
12/25/2017 19:25:50 SIMON pass 
12/26/2017 22:19:20 SAM  pass 
12/27/2017 20:12:55 KEVIN pass 

テキスト形式のテーブルを示してい時間の30秒以内の名前。私のlinuxコードを以下に示します。

awk 'function get_time(d_str){ split(d_str, d, /[/:[:space:]]/); 
return mktime(sprintf("%d %d %d %d %d %d",d[3],d[1],d[2],d[4],d[5],d[6])) }$5=="pass" && status=="reject" && 
(get_time(prev_date)-get_time($1" "$2))<=30;{ prev_date=$1" "$2; 
status=$5 }' cus.txt 

このコードでは、以下の結果をフィルタリングできます。それは私が必要なものではありません。上記

enter image description here

私の必要な結果ではありません。

enter image description here

+0

元のコードをhttps://stackoverflow.com/questions/47680769/filter-with-the-time-in-linux/47681444#47681444から変更しました。ここで、「ステータス」フィールドは「$ 4」 – RomanPerekhrest

答えて

2

必要な場合は、awkを使用できますが、あなたはまた、簡単なシェルスクリプトを使用することができますし、date -dが同じnameで最後rejectと次pass間の時間差を計算する:以下は私の必要な結果を示しています。次に、その差が30秒以下であるかどうかをテストし、その行があれば印刷します。

#!/bin/bash 

rdate= ## empty variables to use for reject 
rtime= 
rname= 

while read -r dt tm nm res; do  ## read date time name result 
    if [ "$res" = "reject" ]; then ## if result "reject" 
     rdate="$dt"     ## save date time name 
     rtime="$tm" 
     rname="$nm" 
    ## elif result is pass, if rname set check name = last reject name 
    elif [ -n "$rname" ] && [ "$nm" = "$rname" ]; then 
     ## compute time difference between reject and current 
     tmdiff=$(($(date -d "$dt $tm" +%s) - $(date -d "$rdate $rtime" +%s))) 
     ## if less than or equal to 30 output line 
     [ "$tmdiff" -le "30" ] && \ 
      printf "%-9s %s %-7s %s\n" "$dt" "$tm" "$nm" "$res" 
    fi 
done <cus.txt 

出力例

$ bash cus.sh 
12/20/2017 13:15:51 JHON pass 
12/25/2017 19:25:50 SIMON pass 
+0

素晴らしいコーディングです。 –

1

GNU awk溶液:

awk 'function get_time(d_str){ 
     split(d_str, d, /[/:[:space:]]/); 
     return mktime(sprintf("%d %d %d %d %d %d",d[3],d[1],d[2],d[4],d[5],d[6])) 
    } 
    $4=="pass" && $3==name && (get_time($1" "$2)-get_time(prev_date))<=30; 
    $4=="reject"{ prev_date=$1" "$2; name=$3 }' file 

出力:

12/20/2017 13:15:51 JHON  pass 
12/25/2017 19:25:50 SIMON pass 
関連する問題