awk的簡要使用

原文地址: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> 

例子

比如上面的awk腳本可以用一行datamash命令代替:

seq -10 3 30|datamash min 1 max 1 median 1 mean 1
-10     29      9.5     9.5
</article>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章