首页 > 解决方案 > Bash - 如何通过常数增加正数并通过相同常数减少负数?(可能是 awk/sed)

问题描述

我有多个数字文件,例如:

文件1.txt

 0.77031
-10.25150   2.80417   3.62904  -9.72425   1.41742   7.96870
-24.75966
-11.22983   21.17503  -0.74532
-13.55239

我需要将每个正数更改为 +x,将每个负数更改为 -x。让 x=8

我为此尝试了 awk 脚本:

for a in $@; do
awk '{FS=OFS="." }/-/{$1-=16}1' $a | awk '{FS=OFS="." }/\d*/{$1+=8}1'
done 

但它似乎只适用于第一个数字。如何使其适用于所有数字?

想要的输出:

 8.77031
-18.25150   10.80417   11.62904  -17.72425   9.41742   15.96870
-32.75966
-19.22983   29.17503  -8.74532
-21.55239

我考虑过使用 sed,但它似乎不适用于增加和减少数字

标签: linuxbashawksed

解决方案


$ awk -v n=8 '{for (i=1; i<=NF; i++) $i += ($i<0 ? -n : n)} 1' file
8.77031
-18.2515 10.8042 11.629 -17.7242 9.41742 15.9687
-32.7597
-19.2298 29.175 -8.74532
-21.5524

推荐阅读