对第二列进行数学运算

对第二列进行数学运算

假设我的原始文件如下所示:

            N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
   NODE FOOT-   NT11     
        NOTE

      3       20.00     
     11       20.00     
   1003       23.75     
   1011       23.75     
   2003       27.52     
   2011       27.52     
   3003       31.30     
   3011       31.30     
   4003       35.08     

我需要生成第二个文件,但只需将第二列上的值乘以 100。我怎样才能得到这个文件?

答案1

假设您想保留数字数据块的字段宽度和格式,我建议类似

awk '
  $1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {
    $0 = sprintf("%6d%12.2f", $1, 100*$2)
  } 1
' file

前任。

$ awk '$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {$0 = sprintf("%6d%12.2f", $1, 100*$2)} 1' file
            N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
   NODE FOOT-   NT11     
        NOTE

     3     2000.00
    11     2000.00
  1003     2375.00
  1011     2375.00
  2003     2752.00
  2011     2752.00
  3003     3130.00
  3011     3130.00
  4003     3508.00

答案2

我选择将请求解释为生成仅由第二列中的数字乘以 100 组成的输出。

这假设标头是静态的并且始终为六行长。它将被忽略。

$ awk 'FNR > 6 { print 100*$2 }' <infile
2000
2000
2375
2375
2752
2752
3130
3130
3508

FNR > 6当至少读取六行时,该条件将触发相乘并输出第二个字段的块。

如果您不知道标头有多长,您可以FNR > 6使用$2 ~ /^-?[0-9.]+$/which is a幼稚的测试第二个字段是否是浮点数的方法,可以选择带符号(“可选-后仅跟数字和点”)。

答案3

假设您的输出保存在名为“outfile”的文件中,这是另一个解决方案 - 尽管警告是它不会保留带有数字数据的列的格式。

awk '{if(/^ *[0-9\.]+ *[0-9\.]+ *$/) {var=$2*100; print $1,var;} else { print $0 }}' outfile

相关内容