如何在bash中选择值的子集



我有一个类似的文件,比如input.dat

column1 column2
0       0
1.3     1.6
1.8     2.1
2.0      
2.6

我需要从第1列中提取值的子集,这些值最接近第2列中的值,以便两列中的条目总数相等。在这个例子中,我需要获得的输出

column1 column2
0      0 
1.8    1.6
2.0    2.1

我怎么能拿到这个?

如果您仅限于bash脚本,则可以使用bash脚本来完成此操作,但使用Python/C++/Java处理这样的问题会更容易,因为这是优化的二部分匹配问题的一个版本(如果在脚本中完成,则必须重复读取每一行,或者使用大量辅助变量)

===>如果我们可以假设两列中的值都是排序并递增的,那么一个简单的解决方案是:

对于第2列中的每个值:

  • 依次读取第1列中的值,直到col2_value与col1_value的差值从负数变为正数
  • 然后找到min(abs(negative_difference),positive_difference),并选择与较小差值相对应的col1_value
  • 从col1和col2中删除这两个条目,并将它们添加到结果表中
  • 重复此过程,直到原始表的第2行中没有剩余内容为止

这具有m*n的最坏情况运行时间,其中m是col1中的#entries,n是col2中的#entries和O(n)的平均运行时间,如果你很聪明,并进行恒定时间交替检查(从上次选择的col1_value的索引中比较-1、+1,因为-2、+2等当然会导致更大的差异),而不是顺序检查,以找到col2中当前值和vol1中值之间的最小差异。

这是一个幼稚的解决方案,因为它不能最大限度地减少系统中的整体差异。最佳解决方案是NP,所以对于大型数据集,你可能能做的最好的事情就是使用一种近似图形算法进行匹配。

相关内容

  • 没有找到相关文章

最新更新