임계값 이상의 모든 값이 추출될 때까지 파일을 반복합니다.

임계값 이상의 모든 값이 추출될 때까지 파일을 반복합니다.

현재 특정 임계값을 초과하는 값에 플래그를 지정하고 해당 값과 다음 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

을 사용 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

관련 정보