原文地址:https://www.lujun9972.win/blog/2020/08/23/在命令行進行簡單的統計分析/index.html
使用awk獲取最小值、最大值、中位數和平均值
使用awk先把數據存入一個數組中,然後對數組進行排序後就可以自己寫代碼找出最小值、最大值、中位數和平均值了:
#! /usr/bin/awk -f { sum += $1 # 假設數據放在第一列 nums[NR] = $1 # 將數據記錄到數組中 } END { if (NR == 0) exit #防止出現處於0的情況To avoid division by zero<span class="org-preprocessor">asort</span>(nums) <span class="org-comment-delimiter"># </span><span class="org-comment">先對數據進行排序,用於記錄中位數</span> <span class="org-comment-delimiter"># </span><span class="org-comment">計算中位數</span> median = (<span class="org-variable-name">NR</span> % 2 == 0) ? ( nums[<span class="org-variable-name">NR</span> / 2] + nums[<span class="org-variable-name">NR</span> / 2 + 1] ) / 2 : nums[<span class="org-preprocessor">int</span>(<span class="org-variable-name">NR</span> / 2) + 1] <span class="org-comment-delimiter"># </span><span class="org-comment">計算平均</span> mean = sum/<span class="org-variable-name">NR</span> <span class="org-preprocessor">printf</span> <span class="org-string">"min = %s, max = %s, median = %s, mean = %s\n"</span>, nums[1], nums[<span class="org-variable-name">NR</span>], median, mean
}
我們可以實驗一下:
seq -10 3 30|~/bin/calculate.awk
min = -10, max = 29, median = 9.5, mean = 9.5
使用datamash進行統計分析
使用awk雖然可以進行統計分析,但是需要自己去實現大量的細節,很麻煩。 datamash
則是一個直接提供了基本統計能力的命令行程序。
datamash的使用非常簡單,其調用規則爲 datamash 選項 統計操作1 數據列1 [統計操作2 數據列2]...
. 它會對 數據列N
所表示的數據執行 統計操作N
. 其中 數據列
一般是一個表示第幾列的數字,但是當數據文件中的第一行是標題時,可以通過 -H
選項來指明數據文件中包含標題行,此時 數據列
可以是標題名來代替。
常見的選項說明
分組
<dd>
datamash支持對數據進行分組統計,通過使用
<code>--group=數據列1[,數據列2,數據列3]</code> 可以指明根據哪幾個域進行分組
</dd>
排序
<dd>
datamash需要輸入的數據是預先經過排序的,若數據未經過排序則需要通過
<code>--sort</code> 選項預先進行排序
</dd>
忽略大小寫差異
<dd>
通過
<code>--ignore-case</code> 選項可以讓 datamash 在分組時忽略大小寫的差異
</dd>
設置分隔符
<dd>
默認情況下datamash使用
<code>TAB</code> 作爲列的分隔符,通過
<code>--field-separator=x</code> 可以設置
<code>x</code> 作爲列分隔符,也可以通過
<code>--whitespace</code> 設置使用一個或多個空格或者tab作爲分隔符。
</dd>
轉置
<dd>
通過
<code>transpose</code> 選項可以交換行列式
</dd>
反轉
<dd>
通過
<code>reverse</code> 選項可以反轉字段的順序
</dd>
跳過空值
<dd>
<code>--narm</code> 跳過空域
</dd>
常見的統計操作
count
<dd>
計算總數據量
</dd>
rand
<dd>
隨機返回一個值
</dd>
sum
<dd>
彙總
</dd>
min
<dd>
取最小值
</dd>
max
<dd>
取最大值
</dd>
absmin
<dd>
取絕對值最小的那個值
</dd>
absmax
<dd>
取絕對值最大的那個值
</dd>
range
<dd>
值域範圍,即max - min
</dd>
mean
<dd>
取均值
</dd>
median
<dd>
取中位數
</dd>
q1
<dd>
取第一四分位
</dd>
q3
<dd>
取第三四分位
</dd>
iqr
<dd>
取四分位距
</dd>
mode
<dd>
取衆數
</dd>
antimode
<dd>
取最少出現的數
</dd>
pstdev
<dd>
總體標準差
</dd>
sstdev
<dd>
樣本標準差
</dd>
pvar
<dd>
總體方差
</dd>
svar
<dd>
樣本方差
</dd>
pskew
<dd>
總體偏度
</dd>
sskew
<dd>
樣本偏度
</dd>
pkurt
<dd>
總體峯度
</dd>
skurt
<dd>
樣本峯度
</dd>
pcov
<dd>
總體協方差,需要兩組數據,用
<code>列1:列2</code> 來表示
</dd>
scov
<dd>
樣本協方差,需要兩組數據,用
<code>列1:列2</code> 來表示
</dd>
ppearson
<dd>
總體皮爾遜相關係數,需要兩組數據,用
<code>列1:列2</code> 來表示
</dd>
spearson
<dd>
樣本皮爾遜相關係數,需要兩組數據,用
<code>列1:列2</code> 來表示
</dd>
</article>