[英]How to print float numbers with awk
我有這個輸入文件:
Adrian 20.6
Bruce 40.2
Adrian 30.4
Janick 24.2
Dave 42.7
Bruce 42.9
Janick 41.2
有了我在這里得到的答案,我能夠對數字求和,但現在數字是浮動的,我不知道如何打印它們。
目前,我的 output 是:
Adrian 50
Bruce 82
Dave 42
Janick 65
但它也應該是小數。
$(awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' $arq > temp.txt && sort temp.txt)
我已經將該代碼按字母順序排序。
您處於小數點分隔符不是 的語言環境中.
所以.
被視為不屬於數字的任何其他字符(例如a
或@
),因此您的數字被截斷為.
.
執行LC_ALL=C awk '...'
將您的語言環境設置為使用.
對於小數點分隔符,然后您的腳本將按原樣工作。
我認為你比你想象的更接近,但你的問題源於沒有處理以正確的順序組合在一起。 默認情況下awk
處理浮點數學。 如果您的輸入數字包含小數位,則sum[$1] += $2
的總和將使用浮點數完成。
為什么您使用Command Substitution ,例如$(..)
尚不清楚。 不需要用您輸入的排序總和填充temp.txt
。 讓我們以一個名為input
的文件中的輸入文件為例。 然后總結和 output 你需要的值不外乎:
awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input
這導致 output 為:
Bruce 83.1
Dave 42.7
Adrian 51
Janick 65.4
要對結果進行排序,只需 pipe awk
output 進行sort
,例如
awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input | sort
結果:
Adrian 51
Bruce 83.1
Dave 42.7
Janick 65.4
現在,要填充temp.txt
,您只需將 output 重定向到temp.txt
,例如
awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input | sort > temp.txt
temp.txt
現在包含排序后的 output。 為了很好地將 output 表格化,您可以格式化 output,方法是將最大長度保存為$1
,並將名稱字段寬度設置為max
,然后以固定格式輸出浮點數(總浮點字段寬度10
和1
小數點后的數字),例如
{sum[$1] += $2; len=length($1); if(len>max)max=len} ... printf "%-*s%10.1f\n", max, i, sum[i]
或完整形式:
awk '{sum[$1] += $2; len=length($1); if(len>max)max=len} END {for (i in sum) printf "%-*s%10.1f\n", max, i, sum[i]}' input | sort > temp.txt
temp.txt
中的結果現在是:
$ cat temp.txt
Adrian 51.0
Bruce 83.1
Dave 42.7
Janick 65.4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.