【问题标题】:Interpolation on shell script bashshell脚本bash上的插值
【发布时间】:2016-05-13 10:21:07
【问题描述】:

我有一个数据文件,其中包含由 GPS 沿剖面定期测量的经度和纬度值(显示在两列上)。在我的个人资料的某个时间点,GPS 停止工作,因此在我的数据中,我有零而不是经度和纬度的值。我想在这些字段之间进行插值以获得经度和纬度的值而不是零。

为了更清楚,这里是我的文件外观的一个简单示例。

[12  7] ;
[14  8 ];
[0   0];
[0   0];
[20  11];
[22  12]

注意:数字在两列,这是编辑的问题

我想在我得到零的地方进行插值。我正在研究 bash,但我不知道该怎么做

【问题讨论】:

  • 抱歉数据显示,通常它们在两列上。我只想在限定零值的值之间进行线性插值
  • 在给定的情况下你期望什么输出?
  • 我认为第一个零线为 [16 9],第二个零线为 [18 10]
  • 嗯,好吧,如果最后一行是[19 12]呢?
  • 事实上我想要一个线性插值,它将给出第二行和最后一行之间的值。

标签: bash shell


【解决方案1】:

如果对第一列和第二列进行一次线性回归,您可能会很幸运。

假设我们正在处理第一列。输入/x轴是测量的索引,输出/y轴是测量本身。所以你的数据可以变成 ((1, 12), (2, 14), (3, 0), (4, 0), (5, 20), (6, 22))。根据已知的输入输出关系,对于索引 (1, 2, 5, 6),您需要推导出一个形式为 y = ax + b 的公式。所以你基本上需要找到a和b。一旦你有了这些,你可以找到输入 3 的 y 为 3a + b,输入 4 的 y 为 4a + b。

您会发现第二列的 a 和 b 不同。

如何找到 a 和 b 有点复杂。您可以查看this 文章以获得很好的介绍以及计算 a 和 b 的公式(内部命名为 b0 和 b1)。

最后一件事 - 我不会尝试在 Bash 中做这样的事情。虽然这是可能的,因为 Bash 支持数组和数学,但这不是它的设计目的。调用 Matlab/Octave 或 R,并使用它们的结果。这些工具内置了对读取文件(例如您的文件)以及进行回归的支持。

【讨论】:

    【解决方案2】:

    你可以用 awk 做到这一点,这是一个脚本:

    script.awk

    BEGIN   { FS="[ [\\];]+"
            # decide on the number of floating digits for the interpolated figures
            FMTStr= "[%.1f, %.1f];\n"
            }
    
            { if( ($2== 0) && ( $3 == 0) ) { zeroLines++ }
              else {
                for( i = 1; i <= zeroLines; i++ ) {
                    t1 = prev1 + (($2 - prev1) / (zeroLines + 1 )) * i
                    t2 = prev2 + (($3 - prev2) / (zeroLines + 1 ) ) * i
                    printf(FMTStr, t1, t2)
                }
                # either printf(FMTStr, $2, $3) #or
                print $0
                prev1 = $2
                prev2 = $3
                zeroLines = 0
              }
            }
    

    这样使用它:awk -f script.awk yourfile,它会给你

    [12  7] ;
    [14  8 ];
    [16.0, 9.0];
    [18.0, 10.0];
    [20  11];
    [22  12];
    

    【讨论】:

    • 谢谢,脚本有效,但唯一的问题是它对所有行进行插值,而我只需要在我有零行的地方进行插值
    • @lefloxy 我稍微更改了脚本并添加了示例输出
    • 请您解释一下字段分隔符 FS 的第一行吗?事实上我的数据没有括号,它只是由空格分隔的两列数字(第一列之前和它们之间的两个空格。
    • @lefloxy 问题中的输入示例有例如第一行[12 7] ;FS 语句处理从中获取数字:这意味着忽略 []、` ` 和 ; 我通过将符号定义为字段分隔符来实现“忽略”。请使用您真正拥有的示例数据更新问题,然后我可以相应地更改脚本。目前我假设您需要更改:每个$2$1 和每个$3$2
    • 谢谢我了解更多,我的数据是 12 7 的形式,在 12 之前有两个空格,在 12 和 7 之间有两个空格。我只是默认定义了字段分隔符并且它有效。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多