現在、特定のしきい値を超える値にフラグを立て、その値と次のn行を出力し、その行を元のファイルのNan値に置き換えるスクリプト(以下)があります。
threshold=5
eventperiod=3
# Flag first occurrence with value over threshold and store the row number as a variable
startrow="$(awk '{print NR " " $1}' tmp.ascii | awk -v threshold=$threshold '$2 > threshold''{print $1;exit}')"
endrow="$(($startrow + $eventperiod - 1))"
# Output range of rows as event
sed -n -e "$startrow,$endrow p" -e "$endrow q" tmp.ascii > output"$startrow".ascii
# Replace rows with Nan value
sed -i "${startrow},${endrow}s/.*/Nan/" tmp.ascii
入力例(tmp.ascii):
1
3
1
200
100
1
3
0
2
1
400
150
200
2
1
1
2
出力イベントの例:
200
100
1
出力更新ファイル:
1
3
1
Nan
Nan
Nan
3
0
2
1
400
150
200
2
1
1
2
ここでは、ファイルにまだしきい値(400)を超える値があることを確認できます。
1行が削除された後に同じファイル内のしきい値が再び超過した場合は、一連のコマンドを再実行するようにこのコマンドを繰り返し実行できるようにしたいと思います。可能ですか?
ありがとうございます。
ベストアンサー1
を使用するwhile
か、同じコマンドを複数回実行できますfor
。until
コードから関数を作成し、すべての値が変わるまで何度も呼び出すことをお勧めします。
たとえば、あなたの例に基づいて考えられる解決策は次のとおりです。
threshold=5
eventperiod=3
replace_next_value() {
# Flag first occurrence with value over threshold and store the row number as a variable
# We need to check also that the input is a number to skip the Nans
startrow="$(awk '{print NR " " $1}' tmp.ascii | awk -v threshold=$threshold '$2 ~ /^[0-9]+$/ && $2 > threshold {print $1; exit}')"
[ -z "$startrow" ] && return 1 # No more rows to replace
endrow="$(($startrow + $eventperiod - 1))"
# Output range of rows as event
sed -n -e "$startrow,$endrow p" -e "$endrow q" tmp.ascii > output"$startrow".ascii
# Replace rows with Nan value
sed -i "${startrow},${endrow}s/.*/Nan/" tmp.ascii
return 0
}
# Call the function until it returns 1
while replace_next_value ; do continue; done