awk интерполяция значений в столбце

awk интерполяция значений в столбце

Я столкнулся с проблемой с длинными текстовыми файлами. У меня есть такой пример:

542    701.00
789    
971    703.00
123    708.00
879    
785    
974
101    716.00

и мне нужно заменить пропущенные значения в столбце $2 интерполированными значениями между верхними и нижними значениями рядом с пропущенными значениями, я ничего не пробовал, потому что я действительно понятия не имею, как даже начать! так что может ли кто-нибудь мне помочь здесь? спасибо

Выход

542    701.00
789    702.00
971    703.00
123    708.00
879    710.00
785    712.00
974    714.00
101    716.00

решение1

Если интерполированные значения должны быть просто расположены через равные интервалы, то это может быть сделано следующим образом:

awk '
  NF > 1 {
    if(i++){ d=($2-s)/i; for(j=1; j<i; j++) printf "%s\t%.2f\n", a[j], s+j*d }
    s=$2; i=0; printf "%s\t%.2f\n", $1, $2
    next
  }
  { a[++i] = $1 }
' file

И нет, это не единственный способ «интерполяции».

решение2

awk '
  BEGIN {split("",A)}
  $2 == "" {
    A[length(A)] = $1
    # print $0, length(A)
  }
  $2 != "" {
    if (length(A) > 0) {
      I = ( $2 - P2 ) / (length(A) + 1)
      for(X=0; X<length(A); X++) {
        print "<" A[X] " "  (P2 + I * (X+1)) ">"
      }
      split("",A)
    }
    print  "!" $1 " " $2 "!"
    P1=$1; P2=$2
  }
  END {}
'

дает

!542 701.00!
<789 702>
!971 703.00!
!123 708.00!
<879 710>
<785 712>
<974 714>
!101 716.00!

Связанный контент