使用awk进行算术运算

时间:2016-07-23 09:01:12

标签: macos awk

我正在尝试使用awk修改此文件的第一列:

0.947250   0.000000 0.001000 0.015500 0.177000 0.806500
0.971700   0.000000 0.000100 0.005000 0.102900 0.892000
0.985701   0.000000 0.000000 0.001200 0.054795 0.944006
0.994251   0.000000 0.000000 0.000000 0.022998 0.977002
0.996850   0.000000 0.000000 0.000000 0.012599 0.987401
0.998150   0.000000 0.000000 0.000000 0.007399 0.992601
0.998800   0.000000 0.000000 0.000000 0.004800 0.995200
0.999250   0.000000 0.000000 0.000000 0.003000 0.997000
0.999450   0.000000 0.000000 0.000000 0.002200 0.997800
0.999750   0.000000 0.000000 0.000000 0.001000 0.999000

我需要将第一列中的值转换为1值,而不改变其他列。我正在尝试命令

awk '{ x=1.-$1; print x,$2,$3,$4,$5,$6}' in_file > out_file

但是这给了我

1  0.000000 0.001000 0.015500 0.177000 0.806500
1  0.000000 0.000100 0.005000 0.102900 0.892000
1  0.000000 0.000000 0.001200 0.054795 0.944006
1  0.000000 0.000000 0.000000 0.022998 0.977002
1  0.000000 0.000000 0.000000 0.012599 0.987401
1  0.000000 0.000000 0.000000 0.007399 0.992601
1  0.000000 0.000000 0.000000 0.004800 0.995200
1  0.000000 0.000000 0.000000 0.003000 0.997000
1  0.000000 0.000000 0.000000 0.002200 0.997800
1  0.000000 0.000000 0.000000 0.001000 0.999000

我做错了什么?

我也尝试了不同的陈述,但都没有奏效。这是一个截图:

enter image description here

更新

问题出现在我的awk版本(我在OSX 10.9.5上使用awk版本20070501)而不是语法。事实上,我下载了gawk,现在一切似乎都没问题。所以问题应该是为什么我的awk似乎无法正常工作......

4 个答案:

答案 0 :(得分:3)

默认情况下awk使用print命令打印所有字段。下面就足够了:

awk '{$1=1-$1;print}' in_file > out_file

修改:根据[ @ed-morton's ][ this ]的评论回答:

如果语言环境不是C(或POSIX,它应该是相同的),有时awk会以意想不到的方式运行。

LC_ALL_OLD="$LC_ALL"
LC_ALL=C
awk '{$1=1-$1;print}' in_file > out_file
LC_ALL="$LC_ALL_OLD"

<强>参考

[ What does LC_ALL=C do? ]

答案 1 :(得分:0)

我解决了在我的mac上安装gawk的问题(OSX 10.9.5)。出于某种原因,我的awk实施无法正常运行。

gawk '{ x=1.-$1; print x,$2,$3,$4,$5,$6}' in_file > out_file

现在输出正确:

0.05275 0.000000 0.001000 0.015500 0.177000 0.806500
0.0283 0.000000 0.000100 0.005000 0.102900 0.892000
0.014299 0.000000 0.000000 0.001200 0.054795 0.944006
0.005749 0.000000 0.000000 0.000000 0.022998 0.977002
0.00315 0.000000 0.000000 0.000000 0.012599 0.987401
0.00185 0.000000 0.000000 0.000000 0.007399 0.992601
0.0012 0.000000 0.000000 0.000000 0.004800 0.995200
0.00075 0.000000 0.000000 0.000000 0.003000 0.997000
0.00055 0.000000 0.000000 0.000000 0.002200 0.997800
0.00025 0.000000 0.000000 0.000000 0.001000 0.999000

还有不同的陈述:enter image description here

Installing gawk on mac

答案 2 :(得分:0)

同意语言环境可能是罪魁祸首的评论,OP可以使用“。”中的任何一种语言环境。不是小数点分隔符。例如,

LC_ALL=it_IT.UTF-8 ./foo.sh;cat out_file

给了我(相同版本的BSD-awk):

1 0.000000 0.001000 0.015500 0.177000 0.806500
1 0.000000 0.000100 0.005000 0.102900 0.892000
1 0.000000 0.000000 0.001200 0.054795 0.944006
1 0.000000 0.000000 0.000000 0.022998 0.977002
1 0.000000 0.000000 0.000000 0.012599 0.987401
1 0.000000 0.000000 0.000000 0.007399 0.992601
1 0.000000 0.000000 0.000000 0.004800 0.995200
1 0.000000 0.000000 0.000000 0.003000 0.997000
1 0.000000 0.000000 0.000000 0.002200 0.997800
1 0.000000 0.000000 0.000000 0.001000 0.999000

,而

LC_ALL=en_US.UTF-8 ./foo.sh;cat out_file

给了我

0.05275 0.000000 0.001000 0.015500 0.177000 0.806500
0.0283 0.000000 0.000100 0.005000 0.102900 0.892000
0.014299 0.000000 0.000000 0.001200 0.054795 0.944006
0.005749 0.000000 0.000000 0.000000 0.022998 0.977002
0.00315 0.000000 0.000000 0.000000 0.012599 0.987401
0.00185 0.000000 0.000000 0.000000 0.007399 0.992601
0.0012 0.000000 0.000000 0.000000 0.004800 0.995200
0.00075 0.000000 0.000000 0.000000 0.003000 0.997000
0.00055 0.000000 0.000000 0.000000 0.002200 0.997800
0.00025 0.000000 0.000000 0.000000 0.001000 0.999000

进一步阅读:

答案 3 :(得分:0)

您的awk行为正常,问题是您的区域设置当前使用,而不是.作为小数点并且与您的数据相矛盾,因此字符串0.5将是在数值运算中被视为0,因为预期的数字应为0,5

使用:

LC_ALL=C awk '{$1=1-$1}1' in_file > out_file

(或在您的环境中导出LC_ALL = C以对所有命令使用该设置),并查看https://unix.stackexchange.com/a/87763/133219以获取有关区域设置和LC_ALL的信息。