【问题标题】:finding and sorting datapoints in bash and awk在 bash 和 awk 中查找和排序数据点
【发布时间】:2015-10-13 13:43:17
【问题描述】:

首先,让我澄清一下,不幸的是我在编程方面还很缺乏经验,所以我真的需要一些帮助。

我有什么:

我有一个包含 3 列的数据文件:$1=(Energy1)$2=(Energy2)$3=(intensity of their frequency in combination)。 如果我绘制这些数据,例如在 gnuplot 中通过 spl "datafile.dat" u 1:2:3 获得带有二维光谱的曲面图。

我想要什么:

现在,我只想选择某些数据点,我的($1-$2)=5.7 给出了这个特定值,从而获得了沿对角线的线谱,$1$2 的所有可能组合产生了这个值.

然后,新数据文件应包含$1 值和与所选行对应的强度(存储在$3),其中包含$1$2 的正确值,产生5.7。

我曾尝试使用 awk 在 bash 中执行此操作,但不幸的是直到现在我都失败了。请帮我!!!非常感谢您。

【问题讨论】:

  • 如果您提供输入数据的小样本以及所需的输出数据,这将对我们有所帮助。
  • 您当然可以使用 awk 执行此操作,但如果您测试相等性,值 5.7 可能会导致一些问题(因为 5.7 不能精确编码为浮点数;最好检查一下对于接近它的值而不是完全匹配的值)。

标签: bash awk gnuplot


【解决方案1】:

也许我不了解所有问题,或者您可能遇到其他人指出的浮动相等问题,但为什么简单的数据过滤器不起作用?:

awk -v s=5.7 -v e=.01 '{d=$1-$2-$s}d<e&&d>-e{print $1,$3}'

如果您想要/需要,请进行排序:

| sort -n

或者,您的数据是否可能过于稀疏,而您正在寻找一些值插值解决方案?

【讨论】:

  • 非常感谢!你的回答很有用。我尝试了下面已经提到的“gnuplot”命令,但无论如何要存储我需要“awk”的值。
【解决方案2】:

这个你不需要awkgnuplot可以做到。

admissible(x,y,value,epsilon)=(abs(x-y-value)<epsilon)
plot 'datafile.dat' using (admissible($1,$2,5.7,1e-5)?$1:1/0):3 with points

函数admissible 对数据文件的每一行进行测试,如果它返回true,则绘制点($1,$3),否则x坐标设置为未定义(1/0),因此该点为没有绘制。唯一的缺点是不能使用lines 样式,因为行会被不允许的数据点打断。

【讨论】:

  • 不,单独的set table 并不能帮助绘制线条,因为无效点也会写入输出文件
  • @Christoph True--必须使用另一个工具排除以“u”结尾的行。谢谢。
【解决方案3】:

如果你想比较每一个 $1 和每一个 $2,你需要遍历文件 2 次,一次收集所有的 $1,$3 对,接下来做所有的比较:

awk -v diff=5.7 '
    NR == FNR {
        # this is the first trip through
        val[$1] = $3
        next
    }
    {
        for (v1 in val) {
            if ( (v1 - $2) == diff ) {
                print v1, val[v1]
            }
        }
    }
' file file   # yes, give the same filename twice.

要解决 @Baruchel 关于浮点精度的评论,试试这个:

awk -v diff=5.7 -v epsilon=0.0001'
    NR == FNR {val[$1] = $3; next}
    {
        for (v1 in val) {
            delta = v1 - $2 - diff
            if (-epsilon <= delta && delta <= epsilon) 
                print v1, val[v1]
        }
    }
' file file

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2016-03-30
    相关资源
    最近更新 更多