
Я столкнулся с проблемой с длинными текстовыми файлами. У меня есть такой пример:
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!