Awk乘法给出零

时间:2016-01-26 12:18:57

标签: macos bash awk

我使用awk有点新鲜。我的目标是创建一个形式为bash的函数:

myfunction file column value

获取文件中给定的列号,将其乘以值并重写文件。现在我写了以下内容:

function multiply_column {
 file=$1
 column=$2
 value=$3
 awk -F" " '{print $col*mul}' col=$column mul=$value $file
}

我的文件如下:

   0.400000E+15    0.168933E+00   -0.180294E-44    0.168933E+00
   0.401000E+15    0.167689E+00   -0.181383E-44    0.167689E+00
   0.402000E+15    0.166502E+00   -0.182475E-44    0.166502E+00
   0.403000E+15    0.165371E+00   -0.183569E-44    0.165371E+00
   0.404000E+15    0.164298E+00   -0.184666E-44    0.164298E+00
   0.405000E+15    0.163284E+00   -0.185766E-44    0.163284E+00
   0.406000E+15    0.162328E+00   -0.186868E-44    0.162328E+00
   0.407000E+15    0.161431E+00   -0.187972E-44    0.161431E+00
   0.408000E+15    0.160593E+00   -0.189080E-44    0.160593E+00
   0.409000E+15    0.159816E+00   -0.190189E-44    0.159816E+00
   0.410000E+15    0.159099E+00   -0.191302E-44    0.159099E+00
   0.411000E+15    0.158442E+00   -0.192416E-44    0.158442E+00
   0.412000E+15    0.157847E+00   -0.193534E-44    0.157847E+00
   0.413000E+15    0.157312E+00   -0.194653E-44    0.157312E+00
   0.414000E+15    0.156840E+00   -0.195775E-44    0.156840E+00
   0.415000E+15    0.156429E+00   -0.196899E-44    0.156429E+00
   0.416000E+15    0.156081E+00   -0.198026E-44    0.156081E+00
   0.417000E+15    0.155796E+00   -0.199154E-44    0.155796E+00
   0.418000E+15    0.155573E+00   -0.200285E-44    0.155573E+00
   0.419000E+15    0.155413E+00   -0.201418E-44    0.155413E+00
   0.420000E+15    0.155318E+00   -0.202554E-44    0.155318E+00
   0.421000E+15    0.155285E+00   -0.203691E-44    0.155285E+00
   0.422000E+15    0.155318E+00   -0.204831E-44    0.155318E+00
   0.423000E+15    0.155414E+00   -0.205973E-44    0.155414E+00
   0.424000E+15    0.155575E+00   -0.207116E-44    0.155575E+00
   0.425000E+15    0.155802E+00   -0.208262E-44    0.155802E+00

我设法打印第一列,但是当我将它与我的值相乘时,awk给了我0.我尝试了我的函数与其他文件,其中数据格式不同,它完美地工作。我也尝试将它与bc结合起来,没有任何成功。

有谁知道为什么在这种情况下awk会给出0?

提前致谢!

#########编辑

我刚刚发现如果我的数据文件使用逗号而不是点(即0,400000E + 15而不是0.400000E + 15),我的功能正常。所以某种程度上,某些东西被配置为将逗号理解为科学符号分隔符而不是点。这对任何人都响了吗?

2 个答案:

答案 0 :(得分:4)

在执行脚本之前设置LC_ALL=C以获取此问题和其他与语言环境相关的问题的最常见行为。见http://www.gnu.org/software/gawk/manual/gawk.html#Locales。也不要毫无意义地将FS设置为它的默认值,引用你的shell变量(谷歌,如果你不知道为什么),并修复你设置变量的方式来使用生成最直观的结果(见http://cfajohnson.com/shell/cus-faq-2.html#Q24):

LC_ALL=C awk -v col="$column" -v mul="$value" '{print $col*mul}' "$file"

阅读Arnold Robbins撰写的Effective Awk编程,第4版,

答案 1 :(得分:2)

用于创建数据文件的区域设置与您当前的区域设置不匹配。

例如,法语区域设置和类似的区域设置使用逗号作为小数点分隔符,而点是最广泛使用的,也是POSIX默认值。

如果您希望将逗号作为十进制分隔符接受,则可以解决此问题:

LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file"

请注意,这不会像GNU awk一样工作,默认情况下,它不会遵循数字区域设置。您需要使用--use-lc-numeric标记来覆盖。

或者,如果您希望将点作为十进制分隔符接受,但您当前的语言环境使用逗号而您没有使用GNU awk,则可以运行此命令:

LC_NUMERIC=C awk '{print $col*mul}' col="$column" mul="$value" "$file"