使用(g)awk以日期和时间的方式内插基于列的数据

时间:2017-01-13 12:41:28

标签: linux bash awk gawk

我有一些以分号分隔的数据。第一列显示固定的时间步长。在第二和第三列中,您可以看到部分不完整的数据:

INPUT.TXT

14.09.2016:00:00:00;;100
14.09.2016:00:00:01;-1;
14.09.2016:00:00:02;0;300
14.09.2016:00:00:03;;
14.09.2016:00:00:04;;
14.09.2016:00:00:05;;
14.09.2016:00:00:06;4;
14.09.2016:00:00:07;;
14.09.2016:00:00:08;;
14.09.2016:00:00:09;16;307

如何使用awk或gawk对具有空值的数据点之间的每列进行局部线性插值?:

Output.txt的

14.09.2016:00:00:00;-2;100
14.09.2016:00:00:01;-1;200
14.09.2016:00:00:02;0;300
14.09.2016:00:00:03;1;301
14.09.2016:00:00:04;2;302
14.09.2016:00:00:05;3;303
14.09.2016:00:00:06;4;304
14.09.2016:00:00:07;8;305
14.09.2016:00:00:08;12;306
14.09.2016:00:00:09;16;307

已经存在一个gawk脚本,它只对每个列进行全局插值,第一个是最后一个数据点:Using awk to interpolate data column based in a data file with date and time

2 个答案:

答案 0 :(得分:0)

考虑线性时间,数据中的值不会呈现线性。如果您仍想使用线性插值,则应将数据切割成碎片,例如对每个碎片使用this并再次合并碎片。找到正确的部分看起来像是另一个问题,可能只是在数据列中查找值,一旦找到第二个值,在它之后剪切,然后再次从该特定行继续,就像这样(仅考虑第一个数据列({{1 }}):

$2

在考虑第二个数据列(最后一个字段14.09.2016:00:00:00;;100 14.09.2016:00:00:01;-1; 14.09.2016:00:00:02;0;300 14.09.2016:00:00:02;0;300 14.09.2016:00:00:03;; 14.09.2016:00:00:04;; 14.09.2016:00:00:05;; 14.09.2016:00:00:06;4; 14.09.2016:00:00:06;4; 14.09.2016:00:00:07;; 14.09.2016:00:00:08;; 14.09.2016:00:00:09;16;307 )时,您可以(必须)合并第二个和第三个数据。

另请阅读this

答案 1 :(得分:0)

那些非常复杂的东西。是否有替代选项只是用前一个非空列值填充空字段?

INPUT.TXT

14.09.2016:00:00:00;;100
14.09.2016:00:00:01;-1;
14.09.2016:00:00:02;0;300
14.09.2016:00:00:03;;
14.09.2016:00:00:04;;
14.09.2016:00:00:05;;
14.09.2016:00:00:06;4;
14.09.2016:00:00:07;;
14.09.2016:00:00:08;;
14.09.2016:00:00:09;16;307

Output.txt的

14.09.2016:00:00:00;;100
14.09.2016:00:00:01;-1;100
14.09.2016:00:00:02;0;300
14.09.2016:00:00:03;0;300
14.09.2016:00:00:04;0;300
14.09.2016:00:00:05;0;300
14.09.2016:00:00:06;4;300
14.09.2016:00:00:07;4;300
14.09.2016:00:00:08;4;300
14.09.2016:00:00:09;16;307

我刚刚找到了适用于固定列宽awk to Fill Empty Column value with Previous Non-Empty Column value:的解决方案,但在这种情况下没有使用带分号和日期的分号文件。