首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Awk乘法给出零

Awk乘法给出零
EN

Stack Overflow用户
提问于 2016-01-26 12:18:57
回答 2查看 506关注 0票数 1

我对使用awk有点陌生。我的目标是创建一个bash函数的表单:

代码语言:javascript
运行
复制
myfunction file column value

它获取文件中给定的列号,将其乘以值并重写文件。就目前而言,我写了以下几点:

代码语言:javascript
运行
复制
function multiply_column {
 file=$1
 column=$2
 value=$3
 awk -F" " '{print $col*mul}' col=$column mul=$value $file
}

我的档案是这样的:

代码语言:javascript
运行
复制
   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),那么我的函数工作得很好。因此,在某种程度上,某种东西被配置成将逗号理解为科学符号分隔符,而不是点。这对任何人来说都是个好消息吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-26 13:55:38

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

代码语言:javascript
运行
复制
LC_ALL=C awk -v col="$column" -v mul="$value" '{print $col*mul}' "$file"

阅读书有效的奥克编程,第4版,由阿诺德罗宾斯。

票数 4
EN

Stack Overflow用户

发布于 2016-01-26 13:14:59

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

例如,法语区域设置和类似的语言环境使用逗号作为它们的十进制分隔符,而点是使用最广泛的,也是POSIX的默认值。

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

代码语言:javascript
运行
复制
LC_NUMERIC=fr_FR.UTF-8 awk '{print $col*mul}' col="$column" mul="$value" "$file"

请注意,这将不能像GNU awk那样工作,这在默认情况下不符合数值区域设置。您需要使用--use-lc-numeric标志来覆盖。

或者,如果您希望点被接受为十进制分隔符,但您当前的区域设置使用逗号,并且不使用GNU awk,则可以运行以下命令:

代码语言:javascript
运行
复制
LC_NUMERIC=C awk '{print $col*mul}' col="$column" mul="$value" "$file"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35013707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档