我正在處理以下資料集,我想創建一個 awk 腳本以在其他列之間進行算術運算,并將每條記錄的結果添加到一個新列中,該列可以稱為“生存百分比”,只有 2 位小數。
操作如下:
((Total Cases - Total Deaths)/Population)*100
您可以在下面看到資料集的示例:
Country,Other names,ISO 3166-1 alpha-3 CODE,Population,Continent,Total Cases,Total Deaths,Tot Cases//1M pop,Tot Deaths/1M pop,Death percentage
Afghanistan,Afghanistan,AFG,40462186,Asia,177827,7671,4395,190,4.313743132
Albania,Albania,ALB,2872296,Europe,273870,3492,95349,1216,1.275057509
Algeria,Algeria,DZA,45236699,Africa,265691,6874,5873,152,2.587215976
Andorra,Andorra,AND,77481,Europe,40024,153,516565,1975,0.382270638
以下是運行后所需輸出的示例:gawk -F file.awk dataset.csv
Country,Other names,ISO 3166-1 alpha-3 CODE,Population,Continent,Total Cases,Total Deaths,Tot Cases//1M pop,Tot Deaths/1M pop,Death percentage, Survival Percentage
Afghanistan,Afghanistan,AFG,40462186,Asia,177827,7671,4395,190,4.313743132,0.42
Albania,Albania,ALB,2872296,Europe,273870,3492,95349,1216,1.275057509,9.41
Algeria,Algeria,DZA,45236699,Africa,265691,6874,5873,152,2.587215976,0.57
Andorra,Andorra,AND,77481,Europe,40024,153,516565,1975,0.382270638,51.54
我嘗試實作的代碼如下,但它甚至沒有運行,它是一個 shell 腳本,而不是我希望的 awk 腳本。
awk 'BEGIN { FS=OFS="," } NR == 1 { $11="new" } NR > 1 { $11=(($6-$7)/$4)*100 }1' dataset.csv
來自評論:按照您告訴我的消除 ^M 后,我檢測到“人口”列中有應該是數字的行并且有一個字串。您是否有任何想法也可以使用 awk 丟棄滿足此條件的記錄,然后執行我的代碼的操作?任何的想法?
uj5u.com熱心網友回復:
考慮到您的示例和此處顯示的嘗試是awk您可以嘗試的代碼。它洗掉了 Control M 字符(我們在評論中發現),這也檢查了您的第 6、第 7 和第 4 列應該是整數/浮點數等,僅此而已,試一試。
awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { $11="new" }
FNR > 1 && ($6 0=$6 && $7 0=$7 && $4 0=$4){
$11=(($6-$7)/$4)*100
}
1' dataset.csv
或獲取值直到小數點后 2 點嘗試類似(利用sprintf函式將值保存到$11自身:
awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { $11="new" }
FNR > 1 && ($6 0=$6 && $7 0=$7 && $4 0=$4){
$11=sprintf("%0.2f",(($6-$7)/$4)*100)
}
1' dataset.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479961.html
