![AWK if 循环 - 如果任何值小于一](https://linux22.com/image/155287/AWK%20if%20%E5%BE%AA%E7%8E%AF%20-%20%E5%A6%82%E6%9E%9C%E4%BB%BB%E4%BD%95%E5%80%BC%E5%B0%8F%E4%BA%8E%E4%B8%80.png)
我生成了一个巨大的多列输出文件,运行一些关于角度总体的分析软件。遗憾的是,角度定义为 -180° 到 180°,而我需要 0°-360°。
我想要做的是获取整个输入文件,并将每个负值替换为“360+值”的总和,同时保持每个正值不变,并将所有内容打印在制表符分隔的输出文件中,就像原始输入文件一样。
我设法一次简单地完成一列:
awk 'BEGIN {OFS="\t" }; { if($2 < 0) print $1, 360+$2; else print $1, $2}' INPUT > OUTPUT
我想我可以通过包含更多“如果”来为每一列执行此操作,如下所示:
awk 'BEGIN {OFS="\t" }; { if($2 < 0 || $3 < 0) print $1, 360+$2, 360+$3; else print $1, $2, $3}' INPUT > OUTPUT
或者类似的东西,但是必须有更好的方法来做到这一点。我尝试使用“ $0
”,尽管我也无法让它工作。
那么,是否有一个很好的单行(或输入脚本)来检查每列中的每个值是否小于 0(负数),并按原样打印所有正值,同时将 360 添加到沿线的每个负值的:
awk 'BEGIN {OFS="\t" }; { if($0 < 0) print 360+$0; else print $0}' INPUT > OUTPUT
我确实明白这个命令不起作用,虽然基本上这就是我想要的,保持与输入相同的格式,如果值为负则添加 360 并打印,否则只打印。
预先感谢您,感谢您的所有意见。
答案1
您可以使用一个简单的for
循环,例如
{for(i=1;i<=NF;i++){if($i < 0) $i+=360}; print}