[英]adding columns for specified rows & dividing by the number of rows using awk
因此,我對於使用linux和腳本命令真的很陌生,非常感謝您的幫助! 我有1050行8列的文件。 例:
anger 1 0 5 101 13 2 somesentenceofwords
anger 2 0 5 101 23 3 somesentenceofwords
anger 3 0 3 101 35 3 somesentenceofwords
anger 4 0 2 101 23 3 somesentenceofwords
arch 5 0 3 101 34 12 somesentenceofwords
arch 6 0 2 101 45 23 somesentenceofwords
arch 7 0 2 101 23 12 somesentenceofwords
hand 8 9 0 101 32 21 somesentenceofwords
hand 9 0 2 101 23 12 somesentenceofwords
我想做的是,如果第一列與x的行數相同,則輸出這些行的第六列的總和,然后將其除以行數(本質上是平均值)。
因此,在該示例中,由於前4行都是憤怒,因此我想獲取第1列與第6列中所有帶有憤怒的行相對應的數字的平均值。它將加上13 + 23 + 35 + 23 /4。然后對足弓做同樣的事情,然后做手,依此類推。
輸出示例:
anger 23.5 arch 34 hand 27.5
我嘗試這樣做只是為了看看是否可以單獨進行操作,其中每一列都等於一個特定的字母字符串,但甚至無法正常工作。
$ awk '{if($1="anger"){sum+=$6} {print sum}}' filename
這可能嗎?
用awk挺簡單的:
$ awk '{a[$1]+=$6;b[$1]++}END{for (i in a) print i,a[i]/b[i]}' file
hand 27.5
arch 34
anger 23.5
如何運作?
對每條讀取的行執行塊{a[$1]+=$6;b[$1]++}
。 我們創建了兩個映射,一個映射為每個密鑰存儲總和,一個映射為每個密鑰存儲計數。
讀取所有行后,執行塊END{for (i in a) print i,a[i]/b[i]}
。 我們遍歷第一張圖的鍵,然后打印鍵,以及總和除以計數(即均值)。
使用awk
:
awk '!($1 in s){b[++i]=$1; s[$1]=0} {c[$1]++; s[$1]+=$6}
END{for (k=1; k<=i; k++) printf "%s %.1f\n", b[k], s[b[k]]/c[b[k]]}' file
anger 23.5
arch 34.0
hand 27.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.