我正在处理以下数据集,我想创建一个 awk 脚本以在其他列之间进行算术运算,并将每条记录的结果添加到一个新列中,该列可以称为“生存百分比”,只有 2 位小数。
操作如下:
((Column 1 - Column 2)/Column 3)*100
您可以在下面看到数据集的示例:
40462186,177827,7671,4395,190,4.313743132
2872296,273870,3492,95349,1216,1.275057509
45236699,265691,6874,5873,152,2.587215976
77481,40024,153,516565,1975,0.382270638
我尝试实现的代码如下,但它甚至没有运行,它是一个 shell 脚本,而不是我希望的 awk 脚本。awk 'BEGIN { FS=OFS="," } NR == 1 { $11="new" } NR > 1 { $11=(($1-$2)/$3)*100 }1' dataset.csv
来自评论:按照您告诉我的消除 ^M 后,我检测到“人口”列中有应该是数字的行并且有一个字符串。您是否有任何想法也可以使用 awk 丢弃满足此条件的记录,然后执行我的代码的操作?任何想法?
最佳答案
考虑到您的样本和此处显示的尝试是 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
关于ubuntu - 创建一个 awk 脚本以在数据集中生成一个新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72325697/