我使用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),我的功能正常。所以某种程度上,某些东西被配置为将逗号理解为科学符号分隔符而不是点。这对任何人都响了吗?
答案 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"