Linux

在確認缺失數據的同時,具有相同 ID 的所有行的列中的平均值

  • May 28, 2020

我正在嘗試整理一個小的 bash 程式碼來準備用於統計和映射的表型文件。我的目標是對這種性質的文件中相同 PLOT 編號的 WD 列中的值進行平均:

PLOT BLOC NAME CANE# WD
1001 1 A 1 38.8889
1001 1 A 2 33.3333
1001 1 A 3 
1002 1 B 1 
1002 1 B 2 
1002 1 B 3 
1003 1 C 1 63.1579
1003 2 C 2 95
1003 1 C 3 
[...]

我的第一種方法是創建一個新文件,在其中我只儲存繪圖和 WD 列,刪除所有缺少 WD 數據的行,然後應用公式awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' input > output

它工作正常。但是,在這種情況下,我想顯示“缺失數據”的一些繪圖在輸出文件中完全缺失(例如本例中的繪圖 1002)。

我想知道如何在保留缺失數據並將它們納入平均值的同時獲得類似的輸出。事實上,我進行了一些嘗試,但我得到了錯誤的結果,例如,在 plot 1001 的情況下,我得到的平均值是 24 而不是 36(第 3 個數據點失去,不應視為 0)。此外,將命令應用於原始文件以保持列 bloc 和 name 會有所幫助。

#Create a file WD with only plot and WD column 
# Delete missing values (Stems that did not exist, for which measurements were not collected)
awk '$2!=""' WD.txt > WD1.txt
# Average WD for each plot
awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' WD.txt > WD1.txt
sed -i '1d' WD1.txt
sed -i '1i PLOT WD%' WD1.txt

謝謝您的幫助。C

如果 WD 欄位為非空 ex,則只能添加計數。

$ awk '
   NR>1 {sum[$1] += $5; count[$1] += $5=="" ? 0 : 1} 
   END {for (i in sum) print i, (count[i] > 0 ? sum[i]/count[i] : "-")}
 ' WD.txt
1001 36.1111
1002 -
1003 79.0789

如果您不想重新發明輪子,那麼您可以使用Miller,它stats1似乎可以按照您想要的方式處理空欄位:

$ mlr --pprint stats1 -g PLOT -a mean -f WD WD.txt 
PLOT WD_mean
1001 36.111100
1002 -
1003 79.078950

Miller 可從universe儲存庫中的 Ubuntu 中獲得。

引用自:https://unix.stackexchange.com/questions/589602