如何在 'awk' 中插入一个数组?
How to interpolate an array in 'awk'?
我们想使用 'awk' 在数组中插入数据。我有一个数组
1 1 3 3 ...
3 3 5 3
5 5 6 5
6 6 6 5
我们希望获得
1 1 3 3 ...
2 2 4 4
3 3 5 3
4 4 5.5 4
5 5 6 5
6 6 6 5
这样做将使我们拥有一个完整的数组,涵盖第一列的所有可能数据,代表时间线。第 2 列及更多列是数据。矩阵的大小为 4x110100。我们有这个脚本:
awk '
{
P[]=
I[i++]=
}
END{
j=0; s=I[j]; t=I[j+1]
for(i=m;i<=n;i++){
if(I[j+2] && i>t){
j++; s=I[j]; t=I[j+1]
}
print i,P[s]+(i-s)*(P[t]-P[s])/(t-s)
}
}' m=1 n=6 f1.dat > f2.dat
但它只对前两列执行
1 1
2 2
3 3
4 4
5 5
6 6
我们如何将插值扩展到整个数组?!我试过 'for' 或 'while' 脚本,但我们无法实现目标...
您可以通过只跟踪当前行和之前的行来做到这一点:
BEGIN {
# initialise "previous" line
getline;
for (i=0; i<=NF; i++) p[i] = $i;
}
{
# print previous line
print p[0];
# check if column 1 has skipped
if ( (d = -p[1]) > 1 ) {
# if so, insert (d-1) new rows
for (i=1; i<d; i++) {
# interpolate values for each column
for (c=1; c<=NF; c++) {
printf "%s%s",
p[c] + (i/d)*($c-p[c]), # linear interpolation
c==NF ? ORS : OFS; # avoid trailing spaces
}
}
}
# update previous line
for (i=0; i<=NF; i++) p[i] = $i;
}
END {
# print the final line
print p[0];
}
我们想使用 'awk' 在数组中插入数据。我有一个数组
1 1 3 3 ...
3 3 5 3
5 5 6 5
6 6 6 5
我们希望获得
1 1 3 3 ...
2 2 4 4
3 3 5 3
4 4 5.5 4
5 5 6 5
6 6 6 5
这样做将使我们拥有一个完整的数组,涵盖第一列的所有可能数据,代表时间线。第 2 列及更多列是数据。矩阵的大小为 4x110100。我们有这个脚本:
awk '
{
P[]=
I[i++]=
}
END{
j=0; s=I[j]; t=I[j+1]
for(i=m;i<=n;i++){
if(I[j+2] && i>t){
j++; s=I[j]; t=I[j+1]
}
print i,P[s]+(i-s)*(P[t]-P[s])/(t-s)
}
}' m=1 n=6 f1.dat > f2.dat
但它只对前两列执行
1 1
2 2
3 3
4 4
5 5
6 6
我们如何将插值扩展到整个数组?!我试过 'for' 或 'while' 脚本,但我们无法实现目标...
您可以通过只跟踪当前行和之前的行来做到这一点:
BEGIN {
# initialise "previous" line
getline;
for (i=0; i<=NF; i++) p[i] = $i;
}
{
# print previous line
print p[0];
# check if column 1 has skipped
if ( (d = -p[1]) > 1 ) {
# if so, insert (d-1) new rows
for (i=1; i<d; i++) {
# interpolate values for each column
for (c=1; c<=NF; c++) {
printf "%s%s",
p[c] + (i/d)*($c-p[c]), # linear interpolation
c==NF ? ORS : OFS; # avoid trailing spaces
}
}
}
# update previous line
for (i=0; i<=NF; i++) p[i] = $i;
}
END {
# print the final line
print p[0];
}