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を呼び出すことで最良の操作、つまりテキストを処理できます。起動率 他の方法は、よりクリーンで強力で効率的なスクリプトです。