簡體   English   中英

為指定的行添加列並使用awk除以行數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM