代码之家  ›  专栏  ›  技术社区  ›  oshiono

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

  •  0
  • oshiono  · 技术社区  · 4 年前

    我正在处理以下数据集,我想创建一个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来丢弃满足这个条件的记录,然后执行我的代码的操作?知道吗?

    0 回复  |  直到 4 年前
        1
  •  3
  •   RavinderSingh13 Nikita Bakshi    4 年前

    考虑到您的样本和显示的尝试,这里是 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
    
    推荐文章