Iterar o arquivo até que todo valor acima do limite seja extraído

1

Atualmente, tenho um script (abaixo) que sinaliza valores acima de um determinado limite, gera este valor e as n linhas seguintes e substitui essas linhas por valores Nan no arquivo original.

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

Exemplo de entrada (tmp.ascii):

 1
 3
 1
 200
 100
 1
 3
 0
 2
 1
 400
 150
 200
 2
 1
 1
 2

Exemplo de evento de saída:

 200
 100
 1

Arquivo atualizado de saída:

 1
 3
 1
 Nan
 Nan
 Nan
 3
 0
 2
 1
 400
 150
 200
 2
 1
 1
 2

Aqui, você pode ver que ainda existe um valor acima do limite no arquivo (400).

Gostaria de poder executá-lo iterativamente, de modo que, depois que as linhas forem removidas, se houver outra ocorrência acima do limite no mesmo arquivo, a sequência de comandos será executada novamente. Isso é possível?

Obrigado.

    
por L. Marsden 08.12.2016 / 13:33

1 resposta

2

Você pode usar while , for ou until para executar as mesmas instruções várias vezes. Eu recomendo que você crie uma função com seu código e chame-o várias vezes até que todo o valor seja substituído.

Por exemplo, uma possível solução com base no seu exemplo:

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
    
por 08.12.2016 / 17:35