
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!