CSVテスト結果ファイルからランプ期間中にテスト結果を削除する方法は?

CSVテスト結果ファイルからランプ期間中にテスト結果を削除する方法は?

CSVファイルにテスト結果があります。最初のフィールドにはミリ秒単位のタイムスタンプがあります。

以下はCSVファイルのサンプルレコードです。

1628689875326,327,3.1 HTTP Request /api/StaffPortal,200,OK,Concurrency Thread Group   SignIn-ThreadStarter 1-5,text,true,,73018,17,17

ランプアップ(開始時間から5分)およびランプダウン期間(過去5分)の間のテスト結果を削除し、フィルタリングされたテスト結果をCSVファイルに書きたいです。

ハードコードされた値を試してみました。

#!/usr/bin/awk -f

  BEGIN {
    endTime=1628689875326
    startTime=1628689875326-300*1000
    offset=1628689875326-3900*1000

    FS=","
    rowCount=0
  }
  {

    if ($1> startTime && $1<offset){
        rowCount++
        print $0
    }
  }

ベストアンサー1

awkを呼び出すためにshebangを使用する代わりに、shebangを使用してシェルを呼び出し、次にawkを呼び出します。バラよりhttps://stackoverflow.com/a/61002754/1745001なぜ。

私はあなたがしたいことをします:

#!/usr/bin/env bash

awk -F',' '
    NR==FNR {
        if (NR==2) {
            fiveMins = 5*60*1000*1000
            begTime  = $1 + fiveMins
        }
        endTime = $1 - fiveMins
        next
    }
    (FNR==1) || ( (begTime <= $1) && ($1 <= endTime) ) {
        print
        rowCount++
    }
    END {
        print rowCount+0 | "cat>&2"
    }
' "$1" "$1"

tailまたは、次を使用して最後の行のタイムスタンプを取得できます。@GreenOnlineの返信)awkからファイルを2回読み取る代わりに:

#!/usr/bin/env bash

awk -v lastTime="$(tail -n 1 "$1" | cut -d',' -f1)" -F',' '
    NR==2 {
        fiveMins = 5*60*1000*1000
        begTime  = $1 + fiveMins
        endTime  = lastTime - fiveMins
    }
    (NR==1) || ( (begTime <= $1) && ($1 <= endTime) ) {
        print
        rowCount++
    }
    END {
        print rowCount+0 | "cat>&2"
    }
' "$1"

どちらにしても次のように呼び出すことができます。

scriptname input.csv > output.csv

> output.csvまたは、出力ファイル名をハードコーディングしても問題ない場合は、シェルスクリプトのawkスクリプトの後に追加してください。

上記は、CSVに出力に印刷したいヘッダー行があると仮定しています。

Shebangを使用せずにawkを呼び出すと、シェルを使用して最良の操作、つまり別のコマンドを呼び出し、スクリプト引数を複数回使用し、次にawkを呼び出すことで最良の操作、つまりテキストを処理できます。起動率 他の方法は、よりクリーンで強力で効率的なスクリプトです。

おすすめ記事