创建一个 awk 脚本来在数据集中生成一个新列?
Create an awk script to generate a new column in a dataset?
我正在处理以下数据集,我想创建一个 awk 脚本以在与其他列之间进行算术运算,并将每条记录的结果添加到一个新列中,该列可以称为“生存百分比”只有两位小数。
操作如下:
((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
这是 运行ning 后所需输出的示例: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 { ="new" } NR > 1 { =((-)/)*100 }1' dataset.csv
来自评论:按照你说的去掉^M后,我检测到“人口”列中有行应该是数字,并且有一个字符串。您是否有想法也使用awk丢弃满足此条件的记录,然后执行我的代码的操作?有什么想法吗?
考虑到您的示例和此处显示的尝试是您可以尝试的 awk
代码。这会删除 Control M 字符(我们在评论中发现),这还会检查您的第 6、第 7 和第 4 列是否应为 integers/floats 等,仅此而已,请尝试一次。
awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { ="new" }
FNR > 1 && (+0= && +0= && +0=){
=((-)/)*100
}
1' dataset.csv
OR 获取小数点后 2 位的值尝试类似的方法(使用 sprintf
函数将值保存到</code> 本身:</p>
<pre><code>awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { ="new" }
FNR > 1 && (+0= && +0= && +0=){
=sprintf("%0.2f",((-)/)*100)
}
1' dataset.csv
我正在处理以下数据集,我想创建一个 awk 脚本以在与其他列之间进行算术运算,并将每条记录的结果添加到一个新列中,该列可以称为“生存百分比”只有两位小数。
操作如下:
((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
这是 运行ning 后所需输出的示例: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 { ="new" } NR > 1 { =((-)/)*100 }1' dataset.csv
来自评论:按照你说的去掉^M后,我检测到“人口”列中有行应该是数字,并且有一个字符串。您是否有想法也使用awk丢弃满足此条件的记录,然后执行我的代码的操作?有什么想法吗?
考虑到您的示例和此处显示的尝试是您可以尝试的 awk
代码。这会删除 Control M 字符(我们在评论中发现),这还会检查您的第 6、第 7 和第 4 列是否应为 integers/floats 等,仅此而已,请尝试一次。
awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { ="new" }
FNR > 1 && (+0= && +0= && +0=){
=((-)/)*100
}
1' dataset.csv
OR 获取小数点后 2 位的值尝试类似的方法(使用 sprintf
函数将值保存到</code> 本身:</p>
<pre><code>awk '
BEGIN { FS=OFS="," }
{ sub(/\r$/,"") }
FNR==1 { ="new" }
FNR > 1 && (+0= && +0= && +0=){
=sprintf("%0.2f",((-)/)*100)
}
1' dataset.csv