【问题标题】:awk keep column value 0 when two columns have value 0当两列的值为 0 时,awk 保持列值为 0
【发布时间】:2020-01-22 22:28:30
【问题描述】:

我的 infile.txt 文件包含多个列和行,如下所示:

infile.txt

2020  01  13  00  28.5833  77.2000  979  0        282.6  284.3  285.4  0     0
2020  01  13  00  28.5833  77.2000  925  469.578  290.4  296.9  297.7  3.6   5.1
2020  01  13  00  28.5833  77.2000  909  613.987  290.8  298.8  299.5  4.7   3.3
2020  01  13  00  28.5833  77.2000  850  1169.4   288    301.6  303.1  9.3   0
2020  01  13  00  28.5833  77.2000  700  2776.28  279    308.9  309.6  0     7.1
2020  01  13  00  28.5833  77.2000  500  5561.01  258.1  314.6  314.8  14.2  11.9

并且,我想执行一些基于列的计算,如下所示:

awk '{R=0; if($12) R=(('$g'/'$theta_vs')*($11-'$theta_vs')*($8-'$z_s'))/(($12^2)+($13^2)); print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,R }' > test.txt

这项工作完美,并在 $12!=0 时保持 R=0,但当 $12==0 时提供输出值 0,如下所示:

输出文件:

2020  01  13  00  28.5833  77.2000  979  0        282.6  284.3  285.4  0     0     0
2020  01  13  00  28.5833  77.2000  925  469.578  290.4  296.9  297.7  3.6   5.1   5.08926
2020  01  13  00  28.5833  77.2000  909  613.987  290.8  298.8  299.5  4.7   3.3   9.01363
2020  01  13  00  28.5833  77.2000  850  1169.4   288    301.6  303.1  9.3   0     8.21755
2020  01  13  00  28.5833  77.2000  700  2776.28  279    308.9  309.6  0     7.1   0
2020  01  13  00  28.5833  77.2000  500  5561.01  258.1  314.6  314.8  14.2  11.9  16.3555

当 $12 && $13 都为 0 时,我想保持 R=0。

我该怎么做?

谢谢

【问题讨论】:

  • 不要使用取消引用来访问awk 中的shell 变量。使用 -v 选项将它们转换为 awk 变量。
  • 我有一个超过 500 行的脚本,这些变量被频繁使用,并且这些变量的值每次都不同。因此,我保留了这些线的外部以避免混淆。
  • awk -v g=$g -v theta_vs=$theta_vs 有什么令人困惑的地方?

标签: linux shell unix awk


【解决方案1】:

改变

if ($12)

if ($12 || $13)

如果其中任何一个不为零,这将分配R,如果两者都为零,则将其保留在0

【讨论】:

    【解决方案2】:

    请您尝试关注一下。

    awk -v G="$g" -v theta="$theta_vs" -v z="$z_s" '{R=0; if($12 || $13) R=((G/theta)*($11-theta)*($8-z))/(($12^2)+($13^2)); print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,R }' Input_file
    

    如果您的行只有 13 个字段,那么按照 Ed sir 的建议添加以下内容。

    awk -v G="$g" -v theta="$theta_vs" -v z="$z_s" '{R=0; if($12 || $13) R=((G/theta)*($11-theta)*($8-z))/(($12^2)+($13^2)); print $0,R }' Input_file
    

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 2014-11-18
      • 2014-01-15
      • 1970-01-01
      • 2020-04-25
      • 2023-01-19
      • 1970-01-01
      • 2021-06-16
      • 2020-02-16
      相关资源
      最近更新 更多