ubuntu - 创建一个 awk 脚本以在数据集中生成一个新列?

标签 ubuntu awk

我正在处理以下数据集,我想创建一个 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/

相关文章:

android - Ubuntu 会让上网本上的 android 编程更容易吗?

linux - 如何在 Ubuntu 上使用 Emacs sudo 编辑本地文件?

regex - awk 中的 [a-z]+、[A-Z]+、[0-9]+ 和标志命令

awk - 匹配单独文件中的数据

python - Firebird 在特定目录中创建数据库

python - pip安装和全局安装的区别

awk 从 1 中减去列的每一行,其中行大于 .5

linux - 在sed中替换具有正斜杠的字符串

awk - 使用该列的最大值标准化列数据

linux - 在 Ubuntu Linux 中使用 C/C++ 编程