AWK-Interpolation von Werten in der Spalte

AWK-Interpolation von Werten in der Spalte

ich habe ein Problem mit laaaangen TXT-Dateien. Ich habe dieses Beispiel:

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

und ich muss die fehlenden Werte in Spalte $2 durch interpolierte Werte zwischen den oberen und unteren Werten in der Nähe der fehlenden Werte ersetzen. Ich habe nichts versucht, weil ich wirklich keine Ahnung habe, wie ich überhaupt anfangen soll! Kann mir also jemand hier helfen? Danke

Ausgabe

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

Antwort1

Wenn die interpolierten Werte einfach in gleichmäßigen Abständen verteilt werden sollen, dann kann dies Folgendes bewirken:

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

Und nein, dies ist nicht die einzige Möglichkeit zum „Interpolieren“.

Antwort2

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 {}
'

gibt

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

verwandte Informationen