我有以下資料集,我想實作一個迭代,在 awk 檔案中逐行檢查(awk 或 for),然后按以下方式執行它:
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
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
Angola,Angola,AGO,34654212,Africa,99194,1900,2862,55,1.915438434
Anguilla,Anguilla,AIA,15237,Latin America and the Caribbean,2700,9,177200,591,0.333333333
Antigua and Barbuda,Antigua and Barbuda,ATG,99348,Latin America and the Caribbean,7493,135,75422,1359,1.801681569
Argentina,Argentina,ARG,45921761,Latin America and the Caribbean,9041124,128065,196881,2789,1.416472111
Armenia,Armenia,ARM,2972939,Asia,422574,8617,142140,2898,2.039169471
由于我的水平不高,所以我不介意代碼是否很長,因此我可以熟悉代碼所經歷的步驟。
awk '{a[$1] }END{for (i in a)if (a[i]>1)print i;}' file
我發現這個命令可以幫助實作這樣的功能,它是一個 shell 腳本而不是 awk 腳本。
最后,作為指導,根據發布的示例,以下將是所需的輸出,因為我的示例中沒有重復項
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.31
Albania,Albania,ALB,2872296,Europe,273870,3492,95349,1216,1.27
Algeria,Algeria,DZA,45236699,Africa,265691,6874,5873,152,2.58
Andorra,Andorra,AND,77481,Europe,40024,153,516565,1975,0.38
Angola,Angola,AGO,34654212,Africa,99194,1900,2862,55,1.91
Anguilla,Anguilla,AIA,15237,Latin America and the Caribbean,2700,9,177200,591,0.33
Antigua and Barbuda,Antigua and Barbuda,ATG,99348,Latin America and the Caribbean,7493,135,75422,1359,1.80
Argentina,Argentina,ARG,45921761,Latin America and the Caribbean,9041124,128065,196881,2789,1.41
Armenia,Armenia,ARM,2972939,Asia,422574,8617,142140,2898,2.03
預先感謝您的幫助
uj5u.com熱心網友回復:
您的原始代碼:
awk '{a[$1] }END{for (i in a)if (a[i]>1)print i;}' file
有測驗倒置:a[i]>1應該a[i]==1只列印唯一的行。
實作截斷n到小數點后 2 位的一些方法是:
n = substr(n,1,match(n,/[.]/) 2)
n = sprintf("%0.2f",n)
所以你的腳本可能是:
BEGIN { FS=OFS="," } # delimit columns by comma
# csv must not have embedded commas
NR==1 {print; next} # print header
{ $10 = sprintf("%0.2f", $10) } # truncate column 10
# rewrites $0 so uses OFS
{ a[$0] } # using $0 means entire line must be unique
END { for (i in a) if (a[i]==1) print i } # print unique lines
鑒于您對資料清理的評論,使用兩遍方法可能會更好:使用您的原始代碼提醒您輸入錯誤,然后在單獨的遍中截斷。
請注意,如果單個列發生更改,您將獲得看似有效的輸入。這些行是不同的:
Afghanistan,Afghanistan,AFG,40462186,Asia,177827,7671,4395,190,4.313743132
Afghanistan,Afghanistan,AFG,40462106,Asia,177827,7671,4395,190,4.313743132
我想您想檢測到這一點,因此您的健全性檢查需要更加復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479962.html
