迭代文件,直到提取出高于阈值的每个值

迭代文件,直到提取出高于阈值的每个值

我目前有一个脚本(如下),该脚本标记高于给定阈值的值,输出该值和以下 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

您可以使用whileforuntil多次运行相同的指令。我建议您使用代码创建一个函数并多次调用它,直到所有值都被替换。

例如,基于您的示例的可能解决方案:

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

相关内容