我正在尝试使用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
我做错了什么?
我也尝试了不同的陈述,但都没有奏效。这是一个截图:
更新
问题出现在我的awk
版本(我在OSX 10.9.5上使用awk
版本20070501)而不是语法。事实上,我下载了gawk
,现在一切似乎都没问题。所以问题应该是为什么我的awk似乎无法正常工作......
答案 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"
<强>参考强>
答案 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
答案 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
的信息。