Macos Awk乘法等于零

Macos Awk乘法等于零,macos,bash,awk,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.168

我对使用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
LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file"
我设法只打印第一列,但当我将它与我的值相乘时,awk给了我0。我在其他文件中尝试了我的函数,这些文件的数据格式不同,它工作得非常好。我还尝试将它与bc结合起来,但没有成功

有人知道为什么在这种情况下awk给出0吗

提前谢谢

#########编辑
我刚刚发现,如果我的数据文件使用逗号而不是点(即0400000e+15而不是0.400000E+15),我的函数工作正常。因此,不知何故,在某个地方,某些东西被配置为将逗号理解为科学符号分隔符,而不是点。这是否给任何人敲响了警钟?

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

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

如果希望逗号被接受为十进制分隔符,您可以这样解决这个问题:

   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
LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file"
请注意,这不会像GNU
awk
那样工作,默认情况下,它不支持数字区域设置。您需要使用
--使用lc numeric
标志来覆盖

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

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

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

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

如果希望逗号被接受为十进制分隔符,您可以这样解决这个问题:

   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
LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file"
请注意,这不会像GNU
awk
那样工作,默认情况下,它不支持数字区域设置。您需要使用
--使用lc numeric
标志来覆盖

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

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

在执行脚本之前设置
LC_ALL=C
,以获取此问题和其他与区域设置相关的问题最常见的预期行为。看见另外,不要毫无意义地将
FS
设置为默认值,请引用shell变量(如果不知道为什么,请用谷歌搜索),并修改设置变量的方式,以使用生成最直观结果的表单(请参阅):


阅读Arnold Robbins的《有效的Awk编程》,第四版。

在执行脚本之前设置
LC_ALL=C
,以获得此问题和其他与语言环境相关的问题最常见的预期行为。看见另外,不要毫无意义地将
FS
设置为默认值,请引用shell变量(如果不知道为什么,请用谷歌搜索),并修改设置变量的方式,以使用生成最直观结果的表单(请参阅):



阅读Arnold Robbins的《有效的Awk编程》第四版。

Hmm,对我来说很好……我忘了提到我使用Mac OSX。这可能有关系吗?您如何准确地调用函数
multiply\u column
?哪些参数?它在OSX上运行良好。顺便说一句,
awk
的默认分隔符已经是一个空格,因此您可以省略
-F”“
。另外,您应该在使用它的地方加上双引号
$file
,以防它有空格。谢谢您的建议!我把这个函数放在我的.bash_配置文件中,然后调用:myfunction myfile 1 2.0,它应该将第一列乘以2,如果我没有错的话,嗯,对我来说很好…我忘了提到我使用Mac OSX。这可能有关系吗?您如何准确地调用函数
multiply\u column
?哪些参数?它在OSX上运行良好。顺便说一句,
awk
的默认分隔符已经是一个空格,因此您可以省略
-F”“
。另外,您应该在使用它的地方加上双引号
$file
,以防它有空格。谢谢您的建议!我把这个函数放在我的.bash_配置文件中,然后调用:myfunction myfile 1 2.0,它应该将第一列乘以2,如果我没有弄错的话,您可以使用命令
locale
检查您的区域设置。我的区域设置是
LC_NUMERIC=de_de.UTF-8
,它也使用
作为十进制分隔符。它对我有用。@hek2mgl什么对你有用?发布的数据文件?实际的数据文件?与GNU awk?Unix awk?好吧,我不知道那种东西。您的回答并没有完全解决我的问题(我的原始数据文件并没有写为040000E+15,而是写为0.400000E+15,正如问题中提到的,但是awk正在等待一个逗号),但直接向我指出了解决方案:我只是在.bash_配置文件中重置了LC_数值环境变量。LC\u NUMERIC=“en\u US.utf8”出口LC\u NUMERIC非常感谢您的帮助!如果您有英语区域设置和法语数据,则设置LC_NUMERIC是正确的解决方案;如果您有法语区域设置和英语数据,则设置LC_NUMERIC是错误的解决方案。您应该改为设置
LC\u ALL=C
。原因是,对于一个特定的数据集,将LC_NUMERIC设置为法语(正如@jlliagre所认为的那样)是可以的,但您不想将所有的
LC_u
变量单独设置为英语,如果您只使用通用的ISO默认语言环境(即
C
),那么您的惊喜会少得多用于所有文本操作。顺便说一下,您可以使用命令
locale
检查您的区域设置。我的区域设置是
LC\u NUMERIC=de\u de.UTF-8
,它也使用
作为十进制分隔符。它对我有用。@hek2mgl