在bash和awk中查找和排序数据点

时间:2015-10-13 13:43:18

标签: bash awk gnuplot

首先,让我澄清一下,遗憾的是我仍然缺乏编程经验,所以我真的需要一些帮助。

我有什么:

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

我想要的是什么:

现在,我想只选择某些数据点,我的($1-$2)=5.7为此提供此特定值,从而获得沿对角线的线谱,以及$1和{{的所有可能组合1}}产生这个值。

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

我尝试过使用awk在bash中这样做,但不幸的是直到现在我都失败了。请帮我!!!非常感谢你。

3 个答案:

答案 0 :(得分:1)

您不需要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坐标设置为undefined(1/0),因此点未绘制。唯一的缺点是你不能使用lines样式,因为行将被不允许的数据点中断。

答案 1 :(得分:1)

也许我并不了解所有问题,或者也许你有其他人注意到的浮动平等问题,但为什么不通过数据工作进行简单过滤?:

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

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

| sort -n

或者,您的数据是否可能过于稀疏,并且您正在寻找某种值插值解决方案?

答案 2 :(得分:0)

如果你想比较每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