2017-07-19 41 views
-2

我有一個兩列的文件。第一列是日期,第二列包含相應的編號。這兩個逗號由一列分隔。我想把前三個數字的平均值打印到一個新文件中。然後爲第2-4個號碼做同樣的事情。然後是3 - 5等等。例如:使用bash的前十個文本文件的平均數

文件1

date1,1 
date2,1 
date3,4 
date4,1 
date5,7 

輸出文件

2 
2 
4 

有沒有辦法做到這一點使用AWK或其他一些工具?

+1

絕對。在檔案中找到它。它不應該花很長時間。 –

+0

你可能也想谷歌「移動平均」 –

+1

@詹姆斯,你應該已經付出了一些努力到你的問題。請參閱https://stackoverflow.com/help/how-to-ask –

回答

0

更新基於從埃德莫頓

由於做出了有益的反饋改變這裏有一個快速和骯髒的腳本做你問什麼。它沒有太大的靈活性,但你可以很容易地找出如何擴展它。 要運行它保存到一個文件並執行它作爲一個awk腳本或者用認領線或致電AWK -f

// { 
    Numbers[NR]=$2; 
    if (NR >= 3) { 
    printf("%i\n", (Numbers[NR] + Numbers[NR-1] + Numbers[NR-2])/3) 
    } 
} 

BEGIN { 
    FS="," 
} 

說明:

1號線:匹配所有行,「/ 「是匹配運算符,在這種情況下,我們有一個空的匹配,意思是」在每一行都做這件事「。


第3行:使用記錄編號(NR)作爲鍵並存儲第2列的值
第4行:如果我們從文件中讀取3個或更多值
第5行:執行數學計算並打印爲整數
BEGIN塊:將字段分隔符更改爲逗號「,」。

+0

你可以在代碼 – hek2mgl

+0

中使用嵌入式註釋'//不做任何事情,並且在讀取第一行之後設置'FS' ** 。將其設置在BEGIN部分。 –

+0

我不同意//「什麼都不做」。是的代碼將沒有它的工作,但它確實做了一些事情。 你對FS完全正確。我急匆匆地從我身旁滑過。感謝您指出它..現在編輯我的帖子... 非常感謝 –

0

輸入

[email protected]:/tmp$ cat file.txt 
date1,1 
date2,1 
date3,4 
date4,1 
date5,7 

[email protected]:/tmp$ awk -v n=3 -v FS=, '{ 
    x = $2; 
    i = NR % n; 
    ma += (x - q[i])/n; 
    q[i] = x; 
    if(NR>=n)print ma; 
}' file.txt 
2 
2 
4 

或低於一個作圖並在平均點的中心保持參考軸線(你的情況日期)

腳本

[email protected]:/tmp$ cat avg.awk 
BEGIN { 
    m=int((n+1)/2) 
} 
{L[NR]=$2; sum+=$2} 
NR>=m {d[++i]=$1} 
NR>n {sum-=L[NR-n]} 
NR>=n{ 
    a[++k]=sum/n 
} 
END { 
    for (j=1; j<=k; j++) 
     print d[j],a[j]   # remove d[j], if you just want values only 
} 
有用

輸出

[email protected]:/tmp$ awk -v n=3 -v FS=, -v OFS=, -f avg.awk file.txt 
date2,2 
date3,2 
date4,4 
0

如果您INPUT_FILE是相同的,如圖樣本,如果你想爲你所提到的,那麼你可以請嘗試以下,讓我知道如果這有助於你相同的輸出。

awk -F, -v RS="" '{for(i=2;i<=NF-4;i+=2){print ($i+$(i+2)+$(i+4))/3}}' Input_file 

輸出如下。

2 
2 
4 
0
$ awk -F, '{a[NR%3]=$2} (NR>=3){print (a[0]+a[1]+a[2])/3}' file 
2 
2 
4 

添加一點點的數學技巧在這裏,每一個記錄集$2a[NR%3]。所以每個元素的值都會循環更新。並且a [0],a [1],a [2]的總和將是過去3個數字的總和。