使用awk插值数据文件中基于日期和时间的数据列

使用awk插值数据文件中基于日期和时间的数据列,awk,gawk,Awk,Gawk,以下文件有多个列,其中包含日期、时间和不完整的数据集,如使用简单文件所示 # Matrix.txt 13.09.2016:23:44:10;;4.0 13.09.2016:23:44:20;10.0; 13.09.2016:23:44:30;; 13.09.2016:23:44:40;30.0;7.0 如何使用awk对每列进行线性插值以获取缺失的数据: # Output.txt 13.09.2016:23:44:10;0.0;4.0 13.09.2016:23:44:20;10.0;5.0 1

以下文件有多个列,其中包含日期、时间和不完整的数据集,如使用简单文件所示

# Matrix.txt
13.09.2016:23:44:10;;4.0
13.09.2016:23:44:20;10.0;
13.09.2016:23:44:30;;
13.09.2016:23:44:40;30.0;7.0
如何使用awk对每列进行线性插值以获取缺失的数据:

# Output.txt
13.09.2016:23:44:10;0.0;4.0
13.09.2016:23:44:20;10.0;5.0
13.09.2016:23:44:30;20.0;6.0
13.09.2016:23:44:40;30.0;7.0

这里是Gnu awk中的一个解决方案。它为第一个给定的数据文件运行两次,记住第一个和最后一个数据点y1、y2及其时间戳x2、x2,计算点k=y2-y1/x2-x1的斜率,并对空元素y=x1-x+y1进行插值

它不是傻瓜式的,它不检查是否被零除,或者是否有两个斜率点,或者任何其他检查

$ cat inexpolator.awk
BEGIN {
    FS=OFS=";"
    ARGC=3; ARGV[2]=ARGV[1]        # run it twice for first file
}
BEGINFILE {                        # on the second round
        for(i in p)                # compute the slopes
            k[i]=(y2[i]-y1[i])/(x2[i]-x1[i])
}
{
    split($1,a,"[:.]")             # reformat the timestamp
    ts=mktime(a[3] " " a[2] " " a[1] " " a[4] " " a[5] " " a[6])
}
NR==FNR {                          # remember first and last points for slopes
    for(i=2;i<=NF;i++) {
        p[i]
        if(y1[i]=="") { y1[i]=$i; x1[i]=ts }
        if($i!="") { y2[i]=$i; x2[i]=ts }
    }
    next                           # only on the first round
}
{                                  # reformat ts again for output
    printf "%s", strftime("%d.%m.%Y:%H:%M:%S",ts) OFS  # print ts
    for(i=2;i<=NF;i++) {
        if($i=="") $i=k[i]*(ts-x1[i])+y1[i]            # compute missing points
        printf "%.1f%s", $i, (i<NF?OFS:ORS)            # print points
    }
}

我猜你这次也没试过什么?你写了四个非常相似的问题,没有一个显示出你试过什么以及你在哪些方面有问题。请阅读关于堆栈溢出允许的问题类型以及如何提问的页面。
$ awk -f inexpolator.awk Matrix.txt
13.09.2016:23:44:10;0.0;4.0
13.09.2016:23:44:20;10.0;5.0
13.09.2016:23:44:30;20.0;6.0
13.09.2016:23:44:40;30.0;7.0