簡體   English   中英

在bash和awk中查找和排序數據點

[英]finding and sorting datapoints in bash and awk

首先,讓我澄清一下,很遺憾,我對編程還沒有足夠的經驗,所以我確實需要一些幫助。

我有的:

我有一個包含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$2所有可能組合都會產生該值。

然后,新的數據文件應包含$1值和對應於所選行的強度(存儲在$3 ),其中包含正確的值$1$2產生5.7。

我嘗試使用awk在bash中執行此操作,但不幸的是直到現在我都失敗了。 請幫我!!! 提前非常感謝您。

您不需要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樣式,因為線條將被不可接受的數據點中斷。

也許我不理解所有問題,或者您遇到了浮點數相等的問題,但是為什么不對數據進行簡單的篩選呢?:

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

如有需要,請按以下說明進行排序:

| sort -n

或者,您的數據是否太稀疏,並且您正在尋找某種價值插值解決方案?

如果要將每個$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM