我编写了一个非常简单的 awk 脚本,可以反转文件中的每个单词:
awk '
{
for (i=1;i<=NF;i++)
{ x=""
for(j=length($i);j>0;j--)
x=x substr($0,j,1);
print x
}}' file1
file1的内容如下:
hello
现在令我困惑的是,当我替换 - 时:
print x
和
print $x
我得到记录的输出,即。我明白了你好不是相反的输出奥莱。
为什么使用 $x 会给我 $0 的内容?变量在 awk 中如何工作?这真的很令人困惑。当我应该使用 $x 以及何时只使用 x 时,是否有一个设定的规则?
答案1
x
是你的 awk 变量,$x
是不同的东西......
$0
对应于刚刚读取的行的输入字符串内容,而$1
...对应于使用默认分隔符的内容$n
的细分字段。$0
awk 允许您使用变量以编程方式访问字段,即,如果变量MyValue
包含5
,$MyValue
则与 相同$5
。
这里发生的情况是您的变量x
确实包含olleh
字符串,该字符串在数字上被解释为0
。在 awk 中,所有以非数字值开头的字符串在用作数值时都被解释为0
,例如,5*"test"
计算结果为 ,0
因为"test"
解释为0
)。因此,在您的情况下,$x
与 相同$0
,它是提供的输入字符串,即hello
。
答案2
首先你应该知道什么是有效变量awk
。 POSIX 定义awk 变量作为:
以可移植字符集中的 或 字母字符开头
<underscore>
(请参阅 XBD 可移植字符集中的表),后跟可移植字符集中的一系列下划线、数字和字母,最后是“=”字符,应指定变量赋值而不是路径名
因此,当您有一个awk
变量x
,并且想要使用时x
,只需引用它,直接编写x
exampleprint x
或y = x
。
当您使用时$x
,您正在访问awk 字段变量。在 中,通过 后跟数字或数值表达式来awk
访问字段变量。$
所以你写的时候$x
,awk
会先评价x
。如果 x 具有数值,例如1
,则语句变为$1
,awk
将为您提供第一个字段变量的值。或者你有一个像 之类的数值表达式(1+1)
,然后$(1+1)
变成$2
,你将得到第二个字段变量的值。
请注意,当字段编号表达式计算为除非负整数,行为未指定(如x = "qwerty"
或x = "qwerty"+1
,则访问$x
未指定):
未指定字段编号表达式计算为非负整数以外的任何值的效果;在此上下文中,未初始化的变量或字符串值不需要转换为数值
在您的情况下,您的awk
实现将字段编号表达式(它是一个字符串)评估为,因此您获得了变量0
的值。$0
在其他awk
实现中,结果可能不同(至少在 OpenBSD 中awk
,你会得到一个错误illegal field
)。