簡體   English   中英

如何使用 awk 打印浮點數

[英]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 ,然后以固定格式輸出浮點數(總浮點字段寬度101小數點后的數字),例如

{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.

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