
Tengo un problema con muchos archivos de texto. Tengo este ejemplo:
542 701.00
789
971 703.00
123 708.00
879
785
974
101 716.00
y necesito reemplazar los valores perdidos en la columna $2 con valores interpolados entre los valores superior e inferior cerca de los valores perdidos. No intenté nada porque realmente no tengo idea de cómo empezar. ¿Alguien puede ayudarme aquí? gracias
Producción
542 701.00
789 702.00
971 703.00
123 708.00
879 710.00
785 712.00
974 714.00
101 716.00
Respuesta1
Si los valores interpolados deben estar espaciados a intervalos iguales, entonces esto puede ser suficiente:
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
Y no, ésta no es la única forma de "interpolar".
Respuesta2
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 {}
'
da
!542 701.00!
<789 702>
!971 703.00!
!123 708.00!
<879 710>
<785 712>
<974 714>
!101 716.00!